Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Ist meine TPageControl-Philosophie richtig? (https://www.delphipraxis.net/183071-ist-meine-tpagecontrol-philosophie-richtig.html)

Der schöne Günther 9. Dez 2014 19:37

Ist meine TPageControl-Philosophie richtig?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Noch ein paar Monate, dann bin ich schon zwei Jahre Delphi-Land. Aber ich bin mir immer noch unsicher, ob ich VCL-Oberflächen eigentlich richtig baue.

Ich möchte euch deshalb einmal eine sehr kleine Oberfläche (drei hastig zusammengeklickte Seiten) zeigen und wissen, was Ihr dazu meint.
  • Ist das Umschalten der Seiten über ein TPageControl Quatsch?
  • Warum flackern die Grafiken (trotz DoubleBuffered) so irrsinnig?
  • Ich erstelle Layouts immer über TGridPanels. Gibt es bessere Methoden?
  • Sonst irgendwelche Dummheiten?

Ja, es ist eine .zip zum Runterladen. Aber ich verspreche, es geht schnell :duck:
Anhang 42286

dGeek 9. Dez 2014 20:34

AW: Ist meine TPageControl-Philosophie richtig?
 
Ich nutze auch sehr gerne das PageControl, um "Seiten" zu verwalten.
Ja, ich nutze gewiss das PageControl statt das Notebook.

An sich finde ich deine Idee mit deiner GUI aus Frames und Forms ganz nett, aber das muss wohl sehr zeitaufwändig in der Pflege sein.

Ich nutze bei solchen Sachen immer ein PageControl mit mehreren "Seiten", blende die Tabs aus und ersetze die durch eine ListBox.
Keine Frames und nur eine Form. Jetzt noch schön die Funktionalität von der Oberfläche trennen und alles ist super.

Sir Rufo 9. Dez 2014 20:58

AW: Ist meine TPageControl-Philosophie richtig?
 
Ein paar Sachen fallen schon auf
Delphi-Quellcode:
procedure TMainForm.bottomFramenextPageButtonClick(Sender: TObject);
begin

   if (mainPageControl.ActivePage = firstSheet) then begin
      topFrame.ProgressString := '2/3';
      mainPageControl.ActivePage := secondSheet
   end else if (mainPageControl.ActivePage = secondSheet) then begin
      topFrame.ProgressString := '3/3';
      mainPageControl.ActivePage := thirdSheet;
   end;

end;

procedure TMainForm.bottomFramepreviousPageButtonClick(Sender: TObject);
begin
   if (mainPageControl.ActivePage = thirdSheet) then begin
      topFrame.ProgressString := '2/3';
      mainPageControl.ActivePage := secondSheet
   end else if (mainPageControl.ActivePage = secondSheet) then begin
      topFrame.ProgressString := '1/3';
      mainPageControl.ActivePage := firstSheet;
   end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
   mainPageControl.ActivePage := firstSheet;
   topFrame.ProgressString := '1/3';
   firstPageFrame.initGUI();
end;
kann man auch ganz einfach so schreiben
Delphi-Quellcode:
procedure TMainForm.UpdateProgress;
begin
  topFrame.ProgressString := Format( '%d/%d',[ mainPageControl.TabIndex, mainPageControl.PageCount ] );
end;

procedure TMainForm.mainPageControlChange( Sender : TObject );
begin
  UpdateProgress;
end;

procedure TMainForm.bottomFramenextPageButtonClick(Sender: TObject);
begin
  if mainPageControl.TabIndex < mainPageControl.PageCount - 1 then
    mainPageControl.TabIndex := mainPageControl.TabIndex + 1;
end;

procedure TMainForm.bottomFramepreviousPageButtonClick(Sender: TObject);
begin
  if mainPageControl.TabIndex > 0 then
    mainPageControl.TabIndex := mainPageControl.TabIndex - 1;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  mainPageControl.ActivePage := firstSheet;
  firstPageFrame.initGUI();
  UodateProgress;    
end;
Und schon wird es wurscht, wieviele Seiten dein PageControl hat.

Und damit wären wir auch schon beim wieviel bzw. was. Wenn du hier stärker trennen würdest (Anzeige und Logik), dann wäre das wesentlich flexibler und auch einfacher in der Handhabung.

In ein PageControl kann man so ziemlich alles eindocken. Formulare, Panels, ... Wenn man jetzt im Hintergrund ein Liste mit Instanzen hat und jedem Klassentyp eine bestimmtes Control (Form, Panel, etc.) zuordnet, dann kann man zu jedem Klassentyp das passende Control erzeugen, die Instanz zuweisen und in das PageControl eindocken.

Und schon ist es völlig Wurscht, was dort angezeigt wird.

Der schöne Günther 9. Dez 2014 21:11

AW: Ist meine TPageControl-Philosophie richtig?
 
Zitat:

Zitat von dGeek (Beitrag 1282791)
Keine Frames und nur eine Form.

Gerade das würde ich niemals aufgeben: Das Aufsplitten in Frames macht die Sachen übersichtlicher, lässt einen einfacher Oberflächen-Teilbereiche bearbeiten und vor allem lässt es sich schnell direkt wiederverwenden. Wie oft habe ich schon eine fertige Anzeige zur Verteilung von Schokoladensplittern in Keksen in anderen Anwendungen und Seiten wieder verwendet :-)

Zitat:

Zitat von Sir Rufo (Beitrag 1282793)
[...]kann man auch ganz einfach so schreiben[...]Wenn du hier stärker trennen würdest (Anzeige und Logik), dann wäre das wesentlich flexibler und auch einfacher in der Handhabung.

Vielen Dank für deine wie immer ausführliche Antwort. Aber das war mir klar, so würde ich das "in Echt" auch nicht machen ;-)
Mir ging es rein um die VCL-Komponenten, das war nur der notwendigste Code um sich überhaupt durchklicken zu können. Aber darauf wollte ich nicht hinaus.

Die TComponent/TControl/TWinControl-Hierarchie glaube ich auch grob verstanden zu haben. Aber vielleicht ist ja beispielsweise das Layout mittels TGridPanel/FlowPanel Quatsch und es gibt besseres? Vor allem das TPageControl selber: Aufgrund der Tatsache dass der Inhalt (Grafiken, Radiogroups) so derbe flackern mache ich ja garantiert etwas falsch!

stahli 9. Dez 2014 22:21

AW: Ist meine TPageControl-Philosophie richtig?
 
Kannst Du mal ein Video zeigen, was da wie flackert?
Mit XE3 konnte ich das nicht starten.

Mir schien die GUI sehr verschachtelt. Wenn Du die Sichten umschaltest, könntest Du vielleicht auch einfach den aktuellen Frame zerstören und dann Frame1, 2 oder 3 erzeugen und in das Formular einsetzen.


EDIT: Oder lade mal die Exe hoch.

Uwe Raabe 9. Dez 2014 22:49

AW: Ist meine TPageControl-Philosophie richtig?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1282782)
Warum flackern die Grafiken (trotz DoubleBuffered) so irrsinnig?

Bei mir flackern die Grafiken weder mit noch ohne DoubleBuffered.

Zacherl 10. Dez 2014 07:17

AW: Ist meine TPageControl-Philosophie richtig?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1282801)
Zitat:

Zitat von Der schöne Günther (Beitrag 1282782)
Warum flackern die Grafiken (trotz DoubleBuffered) so irrsinnig?

Bei mir flackern die Grafiken weder mit noch ohne DoubleBuffered.

Selbiges gillt für mich. Win 8.1 64 Bit.

Der schöne Günther 10. Dez 2014 08:03

AW: Ist meine TPageControl-Philosophie richtig?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von stahli (Beitrag 1282800)
Wenn Du die Sichten umschaltest, könntest Du vielleicht auch einfach den aktuellen Frame zerstören und dann Frame1, 2 oder 3 erzeugen und in das Formular einsetzen.

Das hatte ich mir auch schon überlegt. Ich hatte bislang Sorge dass das zu lange dauert. Mit dem PageControl habe ich alle Seiten ja nur einmal erstellt und dann für immer griffbereit.

Zitat:

Zitat von Uwe Raabe (Beitrag 1282801)
Bei mir flackern die Grafiken weder mit noch ohne DoubleBuffered.

Ich habe hier einmal eine .GIF-Animation hochgeladen: Beim Vergrößern/Verkleinern flackert es so wild dass die Grafik vielleicht nur noch in 2/3 der Zeit überhaupt angezeigt wird. Ich habe es auf einem halben Dutzend Systemen von Win7-Win10 ausprobiert, es ist überall so.


Wenn ich auf die alte Windows 2000-Oberfläche zurückschalte dann natürlich nicht :stupid:

stahli 10. Dez 2014 11:30

AW: Ist meine TPageControl-Philosophie richtig?
 
Ach so, ich dachte beim Umblättern würde es flackern...
(Zum möglichen Grund kann ich nichts sagen.)


EDIT: Laufen Deine Systeme in einer VM und/oder auf einer sehr lahmen Kiste?

Der schöne Günther 22. Dez 2014 11:55

AW: Ist meine TPageControl-Philosophie richtig?
 
Hat denn niemand eine Ahnung? Ich schäme mich, so etwas peinliches bald ausliefern zu müssen. Was tut Ihr, damit eure TImages nicht flackern?

stahli 22. Dez 2014 12:05

AW: Ist meine TPageControl-Philosophie richtig?
 
Lade doch mal eine Exe hoch.
Vielleicht liegt es ja am Betriebssystem oder Hardware?

Der schöne Günther 22. Dez 2014 12:36

AW: Ist meine TPageControl-Philosophie richtig?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nee. Das ist auf verschiedenen Rechnern und seit ich bei Delphi dabei bin (XE4) so.

Trotzdem einmal hier:
Ich habe hier einfach ein paar TImages auf ein Gridpanel auf ein PageControl gepappt. Ab einer bestimmten Fenstergröße müsste ich mit dem Programm eine medizinische Warnung für Epileptiker ausliefern!

Perlsau 22. Dez 2014 16:18

AW: Ist meine TPageControl-Philosophie richtig?
 
Hi Günther, hab eben dein Programm ausprobiert in einer VM (Win7-32), das zuckt kurz ein bißchen, wenn man die TabSheets umschaltet, aber das ist nicht wirklich ein Flimmern, die Grafiken müssen ja jedesmal neu gezeichnet werden. Mit anderen Worten: ich kann na nichts Beschämendes dran finden ... :?

Der schöne Günther 22. Dez 2014 16:23

AW: Ist meine TPageControl-Philosophie richtig?
 
Hallo - Danke fürs Ausprobieren :thumb:, aber ich sollte es immer dick dazuschreiben: Beim Verändern der Größe des Fensters. Da flackert es dass fast nichts mehr sichtbar ist!

stahli 22. Dez 2014 16:25

AW: Ist meine TPageControl-Philosophie richtig?
 
Bei einer Größenänderung des Formulars flackert es etwas ab einer bestimmten Größe.
Ich denke, das ist halt so bei VCL. Damit kann man m.E. leben.

Perlsau 22. Dez 2014 18:05

AW: Ist meine TPageControl-Philosophie richtig?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1284392)
Hallo - Danke fürs Ausprobieren :thumb:, aber ich sollte es immer dick dazuschreiben: Beim Verändern der Größe des Fensters. Da flackert es dass fast nichts mehr sichtbar ist!

Kann ich mit der heruntergeladenen Exe nicht nachvollziehen, da flackert absolut gar nix, weder in der VM noch auf dem Hostsystem. Liegt vielleicht auch an meiner GeForce mit 512 MB Speicher?

stahli 22. Dez 2014 18:14

AW: Ist meine TPageControl-Philosophie richtig?
 
Auf meinem privaten Rechner flackert es ziemlich extrem - zumindest wenn ich das Formular über alle 3 Monitore vergrößere ;-)
Anzufangen mit Flackern fängt es bei der Größe von knapp 1 Monitor.

Der schöne Günther 22. Dez 2014 18:16

AW: Ist meine TPageControl-Philosophie richtig?
 
Richtig! Bei kleinen Fenstern ist fast nichts zu sehen, aber ab irgendeiner magischen Größe wird es wirklich extrem. Danke- Ich hatte schon Angst alle halten mich für verrückt. :roteyes:

Zitat:

Zitat von Perlsau (Beitrag 1284404)
Liegt vielleicht auch an meiner GeForce mit 512 MB Speicher?

Ich bin hier kein Experte, aber wo spielt denn bei der VCL die Grafikkarte eine Rolle?

Perlsau 22. Dez 2014 19:04

AW: Ist meine TPageControl-Philosophie richtig?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1284409)
Ich bin hier kein Experte, aber wo spielt denn bei der VCL die Grafikkarte eine Rolle?

Bin ich auch nicht, daher weiß ich das nicht und habe ein Fragezeichen hintangestellt.

Bjoerk 22. Dez 2014 22:41

AW: Ist meine TPageControl-Philosophie richtig?
 
Hab jetzt nicht alles gelesen. Hast du schon probiert das PageControl auf DoubleBuffered zu setzen?

himitsu 22. Dez 2014 23:15

AW: Ist meine TPageControl-Philosophie richtig?
 
Zitat:

Hab jetzt nicht alles gelesen.
Hättest du das mal besser gemacht ... vorallem den ersten Post :zwinker:

DoubleBuffered ist kein Allheilmittel, es kann sogar zum Gift werden.
Vorallem bei vielen schnellen Zeichenoperatationen (inkl. Ausgabe) und ganz schlimm wird es bei Transparenzen und abgerundeten Ecken (also auch transparenten Bereichen).

Dieses Flackern entsteht, wenn Ausgaben gemacht werden und vorher alles gelöscht wird, z.B. durch übermalen des Hintergrundes usw.
Besonders schlimm wird wes, wenn die Zeichenoperationen immer langsamer werden, also bei vielen Komponenten neben und vorallem übereinander.


Meine Lösung dagegen: Man verwende garnicht erst solche Komponenten wie TImage und mache es selber (TPaintBox), aber selbst das hilft nicht immer, wenn die Parentkomponenten das Hauptprobem sind.

Der schöne Günther 29. Dez 2014 12:06

AW: Ist meine TPageControl-Philosophie richtig?
 
Helft mir :cry:

(Hier nochmal die GIF-Animation als Beispiel)

himitsu 29. Dez 2014 12:40

AW: Ist meine TPageControl-Philosophie richtig?
 
Du hast es bereits mit DoubleBuffered versucht?

Ja, aber Welches? (bei welcher/welchen Komponenten)

Bjoerk 29. Dez 2014 13:14

AW: Ist meine TPageControl-Philosophie richtig?
 
Ggf. ein Bitmap zwischenschalten. Dann sieht man die einzelnen Zeichenoperationen schon mal nicht mehr. Denke mal du machst da ein FillRect über das ganze ClipRect, sonst würd da nix flackern? Und wie gesagt, evtl. das PageControl doch auf DoubleBuffered setzen.

Der schöne Günther 29. Dez 2014 13:16

AW: Ist meine TPageControl-Philosophie richtig?
 
Doublebuffered in allen Permutationen. Form an, Pagecontrol aus. Form aus, Pagecontrol an. Usw.

Und nein, ich mache überhaupt nichts: Ich setze ein Image auf ein Pagecontrol auf ein Formular. Das reicht schon aus um Epileptiker ins Krankenhaus zu befördern :cheers:

himitsu 29. Dez 2014 14:06

AW: Ist meine TPageControl-Philosophie richtig?
 
Eventuell kann man auch bei einigen der Komponenten gewisse Optionen ala ParentBackground/ParentColor deaktivieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz