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/)
-   -   Delphi Vermischung von Darstellung und Logik (https://www.delphipraxis.net/104396-vermischung-von-darstellung-und-logik.html)

DelphiManiac 3. Dez 2007 10:02


Vermischung von Darstellung und Logik
 
Hallo,

habe eine Frage zur Trennung von Design und Logik.

Ich besitzte eine Fachklasse "TPruefung" die für mich einen kompletten Prüfablauf abbildet.

Das heißt die Fachklasse startet meine Prüfungen (welche Mehtoden der Klasse sind) und kann sie unterbrechen usw..

Gut aber ich will die Durchführung meiner Prüfungen natürlich auch in meiner GUI darstellen.

Jetzt könnte ich (was ich ja gar nicht machen will) mein GUI Objekt direkt ansprechen indem ich diese Unit mit einbinde!
:shock:

soetwa:


Delphi-Quellcode:
function TPruefung.Teste...:Boolean;
var
  I: Integer;
  Bits: Word;
  Flags: TBooleanArrayShort;
begin
    FObj.Set_OL_Config(0);
    FObj.Set_CT_Config(0);
    FObj.Set_Reset;
    frmMainGUI.imgOff.Show; // IMAGE anzeigen       <----AAARGH
    Delay(1000);
    FOLCT.Set_TESTMODE(True);
    for I := 7 downto 0 do
    begin
      FOLCT.Set_CalibDaten(I);
      Delay(2000);
      FObj.Get_OLCTInput(Bits,Flags);
      case I of
        0: begin
...
Welche designerrischen Möglichkeiten gibt es ander der Stelle?

Gruß
DelphiManiac

alzaimar 3. Dez 2007 10:05

Re: Vermischung von Darstellung und Logik
 
Deine Klasse biete ja Funktionalität an.

Entweder du steuerst die Funktionen und die Darstellung 'von außen', also so z.B.:


Delphi-Quellcode:
MyClass.MyFunction;
Form1.ShowFunction;
, oder Du bietest Events an. Letzteres dann, wenn deine Klasse eine komplexe Funktion anbietet, in der Einiges passiert, Du aber jede einzelne Aktion visuell darstellen willst. Dann bietest du die Events 'OnFinishedAction1','OnFinishedAction2' usw. an.

DelphiManiac 3. Dez 2007 11:33

Re: Vermischung von Darstellung und Logik
 
Das heißt,

ich sollte am besten ein Event (bzw gleich mehrere) anbieten, diese OOP-Methodezeiger rufen dann eine
Prozedur der GUI auf, richtig?

Also ungefähr so?

Delphi-Quellcode:
TfrmMainGUI.ShowImage1(Sender:TObject);
begin
 Self.img1.Show;
end;

TPruefung.Teste...;
begin
 Machhierwas...
 Machdawas ...
 OnShowImage1; // rufe Prozedurzeiger auf
 Machnochirgendwas...
end;
Danke

Deep-Sea 3. Dez 2007 11:39

Re: Vermischung von Darstellung und Logik
 
Zitat:

Zitat von DelphiManiac
Das heißt,

ich sollte am besten ein Event (bzw gleich mehrere) anbieten, diese OOP-Methodezeiger rufen dann eine
Prozedur der GUI auf, richtig?

Also ungefähr so?

Delphi-Quellcode:
TfrmMainGUI.ShowImage1(Sender:TObject);
begin
 Self.img1.Show;
end;

TPruefung.Teste...;
begin
 Machhierwas...
 Machdawas ...
 OnShowImage1; // rufe Prozedurzeiger auf
 Machnochirgendwas...
end;
Danke

Net ganz :shock:

TPruefung sollte eine Eigenschaft haben, zB. OnShowImage1. Diese ist zB. vom Typ TNotifyEvent.
Also kommt zu private oder protected eine Variable FOnShowImage1 vom Typ TNotifyEvent und zu public oder published kommt eine property mit dem Namen OnShowImage1 die lese- und schreibzugriff auf FOnShowImage1 hat.

Wenn du das Ereignis auslösen willst musst du
Delphi-Quellcode:
If Assigned(FOnShowImage1) then FOnShowImage1(Self);
schreiben.

dominikkv 3. Dez 2007 11:42

Re: Vermischung von Darstellung und Logik
 
du kannst ja auch beim constructor einen owner übergeben und dann owner.imgOff.Show; aufrufen.
der owner ist dann vom typ TfrmMainGUI und beim create gibst du dann einfach self an;

Deep-Sea 3. Dez 2007 11:45

Re: Vermischung von Darstellung und Logik
 
Zitat:

Zitat von dominikkv
du kannst ja auch beim constructor einen owner übergeben und dann owner.imgOff.Show; aufrufen.
der owner ist dann vom typ TfrmMainGUI und beim create gibst du dann einfach self an;

Was dann aber auch nicht wirklich anders ist, als seine ursprüngliche Methode.
Das Objekt kann man so auch nur mit dieser Form zusammen nutzen und nicht wirklich in andere Projekte etc. einbinden.

[edit] So mal der Owner ab TComponent eig. andere Aufgaben übernimmt als solche ... [/edit]

Jelly 3. Dez 2007 12:26

Re: Vermischung von Darstellung und Logik
 
Ums sauber zu halten, sollte man niemals aus den Funktionalitätsklassen in irgendeiner Form auf die Gui zugreifen. Also weder direkt (frmMain.), noch über die Owner Eigenschaft (die ja gecastet werden muss, und du somit wieder direkten Zugriff auf die Form machst).

Warum?
Weil du so deine Funktionalitätsklasse nicht getrennt nutzen kanns. Sie funktioniert nur in Verbidnung mit deiner Gui. Bietest du z.B. später eine weiter Oberfläche an (z.B. als Webanwendung), bist du auf verlorenem Posten.

Die Lösung heisst Events: Die Gui ruft irgendeine Methode der Klasse auf, und reagiert vias Event wenn was Wichtiges neu gezeichnet werden muss.

Merke: Gut ist Zugriff von Gui->Klasse, nie umgekehrt... Ok, ich halte mich auich nicht immer daran weil das Ganze aufwendiger ist. Aber sauberer ist es auf alle Fälle.

DelphiManiac 3. Dez 2007 12:31

Re: Vermischung von Darstellung und Logik
 
Hi,

aufwendiger auf alle Fälle, aber man muss auch mal an Erweiterung / Fehlersuche denken,

die Zeit die man hier vorher investiert hat in ein sauberes Design holt man dort locker wieder raus.

Mmh nur irgendwie finde ich es blöd für jedes mal zeichnen ein Event zu programmieren,..

Deep-Sea 3. Dez 2007 12:33

Re: Vermischung von Darstellung und Logik
 
Zitat:

Zitat von Jelly
Merke: Gut ist Zugriff von Gui->Klasse, nie umgekehrt... Ok, ich halte mich auich nicht immer daran weil das Ganze aufwendiger ist. Aber sauberer ist es auf alle Fälle.

Was man ja meistens daran fest macht, wie wahrscheinlich es ist die Klasse wo anders zu benötigen. Leider macht man dies ja meist falsch - wenn man sich die Mühe macht, guck niemals jemand wieder danach und wenn nicht, dann steht einige Wochen später der Kunde oder Chef vor der Tür und man wünschte sich es wäre eine schön gekapselte Klasse :roll:

shmia 3. Dez 2007 16:22

Re: Vermischung von Darstellung und Logik
 
Schau dir mal DUnit an.
Das wurde ursprünglich für Unit-Tests entwickelt.
Die Klassenhierarchie und das ganze Konzept taugt aber auch für andere Software Tests.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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