Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » ohoh... 500 Buttons erstellen dauert ewig

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
15.10.2003, 16:10 Uhr
Suchthaufen



Jetzt wirds aber eng.
Das kann ja wohl nicht sein, daß die Erstellung von 500 Buttons so ungefähr 10 Sekunden frisst.
Ich mach folgendes:
Ich lese ein paar Kunden aus aus der Datenbank (genau 562 sinds) und möchte mir für jeden einen Button erstellen. Das ganze klappt auch nur eben die Zeit... mein CColorButton ist abgeleitet von CButton

C++:
    while(!recordSet_.IsEOF())
    {
        CColorButton* button = new CColorButton(id_,parentId_,i,buttonRect_,RGB(192,192,192),"",parentWnd_->GetTopMostWindow());
        button->Create(parentWnd_);
        i++;
        button->colorButton_->SetBkColor(RGB(192,192,192));
        button->colorButton_->SetWindowRect(buttonRect_);
        button->AddText(CalcText(),button->GetDC(),0,font_);
        button->MoveWindow(buttonRect_);
        parentWnd_->buttons_.Add(button);
        parentWnd_->Invalidate();
        recordSet_.MoveNext();
        
    }



wenn ich aber nun das Create ausklammere (natürlich auch das MoveWindow) dann ist das Teil schnell wie erwartet. Warum ist das Create so langsam?
Ich hab zwar Create über schrieben aber da mach ich nur:

C++:
BOOL CColorButton::Create( CWnd* pParentWnd)
{
    // TODO: Fügen Sie hier Ihren spezialisierten Code ein, und/oder rufen Sie die Basisklasse auf.
    DWORD style;
    if (adminMode_)
        style = BS_OWNERDRAW | BS_PUSHBUTTON |WS_CHILD | WS_VISIBLE| WS_SIZEBOX;
    else
        style =BS_OWNERDRAW | BS_PUSHBUTTON |WS_CHILD | WS_VISIBLE;
    return CButton::Create("",
                            style,
                            colorButton_->GetWindowRect(),
                            pParentWnd,
                            colorButton_->GetMessageId());
    
}


woran könnts den noch liegen?

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.10.2003, 17:11 Uhr
Suchthaufen



zum Verzweiflen...
sogar bei 20 Buttons dauerts mindestens eine Sekunde.
Kann mir jemand sagen was ich falsch mache?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.10.2003, 18:41 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Zitat:
Suchthaufen postete
Jetzt wirds aber eng.
Das kann ja wohl nicht sein, daß die Erstellung von 500 Buttons so ungefähr 10 Sekunden frisst.


Doch kann es. Wer macht denn so etwas (500 Button)?
- Speicher reservieren
- Erzeugen
- Text auf dem Button
- Neu Zeichnen
- Speicherzugriffe
Das kostet alles wertvolle Zeit.
OK. Ich sehen ein das Du nicht vorher genau bestimmen kannst, wieviele Button's erzeugt werden müssen, deshalb die Zeiger.
Aber:
- Kannst Du Membervariablen nutzen (CButton button[561])?
- Müssen wirklich soviele von dem Zeug erzeugt werden?
- Stimmt Deine Planung(Du mußt ja auch irgendwie die Ereignisse behandeln)?
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 15.10.2003 um 18:43 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.10.2003, 19:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


mach halt verschiedene "Seiten" also z.b immer 20 pro Seite (diese fest auf die Dialogresource, dann geht die erstellung fix) dann eben ein vor und zurück button. Du musst dir dann halt noch die Postition merken die du dann per vor und zurück um je 20 verschiebst. Dann kannste alles per SetDlgItemText usw setzen und abfragen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.10.2003, 21:35 Uhr
Suchthaufen



@Uwe + Flosoft Ich stell auch nur so ungefähr 20 Buttons dar, hab aber irgendwie feststellen wollen warum das bei 20 Buttons so lange dauert. Praktisch eine "Fehlereinschränkung". Ob meine Planung hinhaut kann ich noch ned sagen, bin aber guter Dinge was das anbelangt.

Ich hab auch schon versucht das zeichnen auszuschalten bringt aber rein Zeittechnisch nix. Und vorher anlegen... na ich weiss ned.
Da müsste ich mal vorab 50 Dialoge erstellen mit wenigstens 50 Buttons drauf. Das gefällt mir gar ned. Warum es so viele sein müssen liegt an der Grundidee: ich will damit Abfragen aus Access darstellen, wobei die Gestaltung der Anzeige "völlig" frei ist.

Hat noch wer einen anderen Tip?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2003, 21:45 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


es reicht doch wenn du ein Dialog mit ca.20-50 buttons erstellst und nen steuerelemtn raufpackst das dir das hin und herschalten erlaubt. (also z.b. TabControl)
Dann simulierst du quasi einfach die anderen Dialog, indem nur in Abhängigkeit des Steuerelementes den Text der Buttons und die Befehle entsprechend anpasst.
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.10.2003, 21:58 Uhr
Suchthaufen



@Windalf: Eine Idee wärs. Aber so einfach denk ich ist es nicht. Ich hab nunmal erlaubt, daß jeder User sich die Dialog so anpassen kann wie er es für richtig hält Also, die Grösse, die Farbe, soviele Texte und Bilder wie er mag. Und eben auch die Abfragen. Welche er als Button (und später auch als Listbox) darstellen kann. Dazu gilt es die Aktionen auf diese Buttons frei zu definieren. Also das ParentWnd muss immer auf andere Events reagieren. Da wär eine in sich geschlossene Klasse mit eigenem Dialog schon wünschenswert. Ich würds nicht nur für "sauberer" halten ich müsste auch, im anderen Fall, 2 Monate Arbeit auf den Müll schmeissen. Die Hemmschwelle ist gross.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.10.2003, 22:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
parentWnd_->Invalidate();



mach diesen aufruf mal ganz am ende nach erstellung ALLER buttons, sonst baut dir windows pro button den dialog 1mal neu auf, das bremst wahnsinnig! (fällt mir grad noch so auf)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.10.2003, 22:32 Uhr
Suchthaufen



Noch mal ein NAchtrag:
Ich hab jetzt meine Ownerdrawbuttons ausgetauscht gegen normale. jetzt gehts in annehmbarer Geschwindigkeit. (Also 500 Buttons unter 1 Sekunde)
Klar ist somit ich hab irgendwo einen fehler in meinen Selbstgezeichneten Buttons.
Die Frage ist jetzt wo?
Ich weiss aber ned ob jemand Lust hat 10 Seiten Code durchzulesen.
Gibts vielleicht typische Fehler die man machen kann beim selbstzeichnen?
Am zeichnen selber sollte es eigentlich nicht liegen, weil wenn ich OnDrawItem auskommentiere wird die Zeit ned weniger.
Irgendwelche Tips?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.10.2003, 22:40 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
aus der Ferne ist so etwas immer schwer auszumachen.
Wenn's Dir was nützt, dann pack mal Dein Projekt (ohne Debug/Release) und mails mir mal.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: