Delphi-PRAXiS
Seite 1 von 3  1 23      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.
Seite 1 von 3  1 23      

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