| Autor |
Beitrag |
jjturbo
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 09:33
Moin Forum,
ich habe folgendes Programm, in denen ich die Parents von einer großen Menge TSpeedButtons ändere:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var i :Integer; begin
for i:= 0 to 480 do begin SpeedButton_1[i].Parent := ScrollBox1; SpeedButton_2[i].Parent := ScrollBox1; SpeedButton_3[i].Parent := ScrollBox1; end;
end; |
Vor dem Aufruf dieser Funktion ist Parent=Form1. Das Durchlaufen dieser Routine dauert ca. 4 Sekunden. Momentan verwende ich Delphi2007. Die gleiche Funktion in einem anderen Projekt, welches ich unter Delphi 5 geschrieben ist in Null-Komma-Nix erledigt...
Hat jemand eine Idee, woran das liegen könnte?
Danke Euch, jjturbo
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 29.01.09 10:06
Ich bin mir nicht ganz sicher. Wird bei ändern des Parent auch neu gezeichnet?
Probiert mal, die Scrollbox auszublenden, dann das Parent zu ändern und dann wieder sichtbar zu machen (nur als schnellen Test).
Wenn das Besserung bringt, würde ich mich mal z.B. mit LockWindowUpdate auseinandersetzen (anstatt es unsichtbar zu machen).
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 10:47
Also das unsichtbar machen und LockWindow / UnlockWindow hatte ich schon probiert, das bringt irgendwie nichts....
Sollte doch so funktionieren, oder? Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure LockWindow(const Handle: HWND); begin SendMessage(Handle, WM_SETREDRAW, 0, 0); end;
procedure UnlockWindow(const Handle: HWND); begin SendMessage(Handle, WM_SETREDRAW, 1, 0); RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN); end;
procedure TForm1.Button1Click(Sender: TObject); var i :Integer; begin
LockWindow(Form1.Handle);
for i:= 0 to 480 do begin SpeedButton_1[i].Parent := ScrollBox1; SpeedButton_2[i].Parent := ScrollBox1; SpeedButton_3[i].Parent := ScrollBox1; end;
UnlockWindow(Form1.Handle);
end; |
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 29.01.09 10:57
Bei mir bringt das Unsichtbarmachen der Scrollbox ungefähr eine Verdopplung der Geschwindigkeit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var i : Integer; ticks : Integer; begin ticks := GetTickCount; scrollbox1.Visible := false; for i := 0 to 480 do begin SpeedButton_1[i].Parent := ScrollBox1; SpeedButton_2[i].Parent := ScrollBox1; SpeedButton_3[i].Parent := ScrollBox1; end; scrollbox1.Visible := true; showMessage(intToStr(GetTickCount - Ticks));
end; |
So braucht es im Schnitt 250 Ticks. Wenn ich Zeile 5 und 12 auskommentier, dann braucht es ca. 480 Ticks.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 11:03
Hmm... Bei mir sind es ca. 2700 zu 2500 ticks.
Wieso fällt der Unterschied bei mir nicht so groß aus?
--- Moderiert von Narses: Beiträge zusammengefasst---
habs grad noch mal probiert: 2714/2544 ticks
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.01.09 13:14
Die Frage ist doch eigentlich: Wozu brauchst du derart viele Buttons und warum musst du deren Parent ändern?
Normalerweise hört sich das nach einem falschen Konzept an.
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 14:03
Da hast Du nicht ganz unrecht.
An einer Maschine wird eine Form angezeigt, an der alle möglichen Handfunktionen aufgelistet sind. Auf Kundenwunsch sollen neben jeder dieser Handfunktionen jeweils ein Button zum Einschalten, einer zum Ausschalten und einer zum umschalten sein.
In diesem Projekt gibt es momentan 320 Handfunktionen, wir hatten in anderen Projekten schon ähnlich viele, ist normalerweise auch kein Problem, die Initialisierung passiert ja nur einmal. Zwei Sekunden könnte ich ja verschmerzen, es werden allerdings auch noch jede Menge LED´s und Textfelder erstellt, das Ganze dauert dann so an die zwanzig Sekunden.
In alten Projekten gehts bedeutend schneller.
Und was die Parents angeht: Ich habe gesucht was hierso lange dauert. Die Elemente sollen in einer Scrollbox erscheinen, also erstelle ich sie nach diesem Prinzip:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| SpeedButton_1[i] := TSpeedButton.Create(Form1);
with SpeedButton_1[i] do begin Parent := Scrollbox1; Top Left width caption . . . usw end; |
Wenn die Zuweisung Parent := xxx weggelassen wird, dann gehts flott. Also habe ich erst mal alles erstellen lassen, und nachher alle Parents auf einmal umgeschrieben, um zu sehen, wie lange das dauert.
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.01.09 14:09
Wie wäre es, wenn du eine normale Scrollbar verwendest und nur die Funktion und Beschriftung der Buttons änderst? Wenn jede Zeile identisch aussieht, sollte das doch sehr einfach sein.
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 14:14
Da hatte ich auch schon dran gedacht. Dann müsste ich allerdings die ganze Beschriftungsfelder und LED´s auch mit ändern, und mit der Scrollbox funktioniert das wirklich wunderbar, wenn die ganzen Objekte erst vorhanden klappt das auch wunderbar flüssig, nichts dran auszusetzen.
ich versuche gerade nach dem Starten des Programms die Komponenten im Hintergrund in einem Thread zu erstellen, so daß, wenn man die Form mit den Handfunktionen öffnet, die Komponenten alle an "Ort und Stelle" sind.
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 29.01.09 14:26
Mach einfach eine Statusanzeige, während die Buttons erstellt werden. Text der Statusanzeige: "Warte auf Antwort der Maschine"
Dann ist Dein Programm aus dem Schneider!
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 14:35
Zur Not auch das!
Aber nicht aufgeben, versuche an der Lösung mit dem Thread...
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 14:53
Ich glaub´ich werd bekloppt:
habe das mit Thread ausprobiert, alles wurde sauschnell erzeugt.
Nur zum Testen habe ich es noch mal auf die alte Methode probiert: Genau so schnell!!!

_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 29.01.09 14:58
jjturbo hat folgendes geschrieben : | Ich glaub´ich werd bekloppt:
habe das mit Thread ausprobiert, alles wurde sauschnell erzeugt.
Nur zum Testen habe ich es noch mal auf die alte Methode probiert: Genau so schnell!!! |
Da war dann garantiert noch irgendwo anders der Wurm drin. Wurde bestimmt irgendwas implizit aufgerufen, womit Du nicht gerechnet hast.
Manchmal muss man einfach Feierabend machen und am nächsten Tag sieht man das Problem auf den ersten Blick.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 15:06
So isses!
Töröööö!
(das war meine persönliche Feierabendsirene)
Danke noch mal an alle!
Gruß Oliver
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.01.09 15:07
Ich hab mal nen kleinen Vergleich gemacht, siehe Anhang.
Einmal normal, einmal mit unsichtbarer ScrollBox und einmal mit ScrollBar. Wobei du jedesmal einzeln das Programm starten solltest, damit sich die Ergebnisse gegenseitig nicht beeinflussen. Angezeigt werden danach die Millisekunden.
Einloggen, um Attachments anzusehen!
|
|
jjturbo 
      
Beiträge: 516
Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
|
Verfasst: Do 29.01.09 15:17
OK, ganz ohne die ScrollBox gehts noch mal bedeutend schneller 
_________________ Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 29.01.09 15:21
jjturbo hat folgendes geschrieben : | OK, ganz ohne die ScrollBox gehts noch mal bedeutend schneller  |
Ich würde behaupten, man verteilt die Wartezeiten halt so, dass die User es nicht mehr stört - was aber im Endeffekt zielführend ist.
Die schnelle Erstellung erkauft man sich ja damit, dass die Captions der Buttons beim Scrollen geändert werden müssen. Das geht aber für einen Scrollschritt so schnell, dass es den User nicht mehr stört.
Daher würde ich auch für die Lösung ohne Scrollbox plädieren.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
|