Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Konzeptfrage Wertübergabe (https://www.delphipraxis.net/140023-konzeptfrage-wertuebergabe.html)

martin_ 10. Sep 2009 13:16


Konzeptfrage Wertübergabe
 
Hallo,
ich habe folgendes Problem: Gegeben ist ein Formular mit einer Listbox die als Einträge zb. Ziffern von 1 bis 10 hat. Dieses Formular befindet sich in UnitA. Ein weiteres Formular (UnitB) besteht aus einem Eingabefeld und einem Button um die Eingabe zu prüfen.
Der Benutzer wählt einen Eintrag aus der Listbox, durch Betätigung der Enter Taste wird UnitB als modaler Dialog angezeigt. Der Prüfen Button wird betätigt um Duplikate in der Liste zu finden.
Wie funktioniert die Übergabe der Parameter? Von UnitA kann auf UnitB zugegriffen werden. Von UnitB kann nicht auf UnitA zugegriffen werden.
Ist es sinnvoll eine Referenz mit der Liste der Einträge an UnitB zu senden, um diese dort zu verarbeiten (Prüfen ob durch Eingabe Duplikate entstanden sind), oder gibt es eine bessere Möglichkeit? Das ganze auf einem Formular zu realisieren ist nicht möglich.
Eine Möglichkeit die mir noch eingefallen ist, wäre eine eigene Unit die nur die Daten für die Liste beinhaltet und UnitA und UnitB haben Zugriff auf diese. Was ist in so einem Fall vernünftig?

BAMatze 10. Sep 2009 13:24

Re: Konzeptfrage Wertübergabe
 
Schau mal nach WM_Copydata

Quellcode in der versendenden Unit
Delphi-Quellcode:
type TDatenaustausch = record
  dwData, cdData: integer;
  lpData: string;
end;

...

// result ist hier ein string (liegt also in einer Funktion: string)!!
 with Datenaustausch do
        begin
          dwData := 0;
          cdData := Length(result) + 1;
          lpData := result;
        end;
      SendMessage(LoaderForm.Handle, WM_COPYDATA, Longint(Handle),
              Longint(@Datenaustausch));
Quellcode in der empfangenden Unit
Delphi-Quellcode:
procedure Nachricht_anzeigen(var MSG: TWMCopyData);message WM_COPYDATA;
begin
  Label.Caption := String(PChar(Msg.CopyDataStruct.lpData));
end;
So tausche ich Daten bei der Initalisierung meines Projektes aus. Also die einzelnen Units senden Berichte an das Splash mit dem was sie gerade machen. Funktioniert bei mir wunderbar.

jaenicke 10. Sep 2009 13:25

Re: Konzeptfrage Wertübergabe
 
Die saubere Lösung ist eine konsequente Trennung der Daten von der Oberfläche. Also eine dritte Unit mit einer eigenen Klasse, die die Datenverwaltung übernimmt.

Ansonsten ginge auch eine Übergabe der zu bearbeitenden Daten als Referenz. Das ist zwar nicht ganz so schön, aber immer noch eine saubere Lösung.

Ein direkter gegenseitiger Zugriff wäre auch möglich, aber das wäre unübersichtlich und das Gegenteil von gutem Code. Denn man kann die erste Unit in der zweiten einfach unterhalb von implementation in die uses legen. (Ich hoffe ich habe dich jetzt nicht auf dumme Gedanken gebracht, das ist keine gute Lösung...)

// EDIT:
WM_COPYDATA? Wozu das? Man kann doch einfach die Referenz auf die Daten benutzen, es ist doch der selbe Prozess usw. :gruebel:

DeddyH 10. Sep 2009 13:27

Re: Konzeptfrage Wertübergabe
 
Wozu WM_COPYDATA in diesem Fall? Es handelt sich doch nicht um IPC. Der Ansatz mit der "Brückenunit" erscheint mir vernünftig, so sollte man es IMHO mit gemeinsam genutzten Variablen/Konstanten immer halten.

Klaus01 10. Sep 2009 13:28

Re: Konzeptfrage Wertübergabe
 
.. kannst Du die Daten nicht beim Erstellen des Dialogs übergeben?

Delphi-Quellcode:
dialog := TDialog.create('deineDaten);
dialog.showModal;
Grüße
Klaus

BAMatze 10. Sep 2009 13:33

Re: Konzeptfrage Wertübergabe
 
hmm Mist, da war ich mal froh als erster zu antworten :-D aber habt recht, bei mir läuft da noch nen Threat nebenbei, deswegen der Umstand bei meinem Copydata.
Schließe mich der Meinung von DeddyH und jaenicke an.

martin_ 10. Sep 2009 14:18

Re: Konzeptfrage Wertübergabe
 
@Klaus01 : Wenn nur die Parameter übergeben werden, benötige ich noch eine Methode die als Ergebnis die Information liefert ob Duplikate vorhanden sind oder nicht. Die würde immer nach betätigen des "Prüfen Button" aufgerufen werden. Es wäre aber auch nicht schlecht diese Methode in der anderen Unit verfügbar zu haben. Würde auch funktionieren, nur hätte ich dabei 2x den selben Code. Aus diesem Grund werde ich es mit einer dritten Unit machen die mir die Daten speichert und auch die Berechnungen durchführt.

Mich würde noch ein Beispiel für eine "Daten Unit" von einem Projekt interessieren.

Klaus01 10. Sep 2009 14:23

Re: Konzeptfrage Wertübergabe
 
Zitat:

Zitat von martin_
@Klaus01 : Wenn nur die Parameter übergeben werden, benötige ich noch eine Methode die als Ergebnis die Information liefert ob Duplikate vorhanden sind oder nicht.

Um das zu überprüfen könntest Du ModalResult verwenden.

Was mir vielleicht entgangen ist, wird in dem Dialog auch ein neuer Wert in die Liste
aufgenommen?
Grüße
Klaus

jaenicke 10. Sep 2009 14:27

Re: Konzeptfrage Wertübergabe
 
Zitat:

Zitat von martin_
Mich würde noch ein Beispiel für eine "Daten Unit" von einem Projekt interessieren.

Im Grunde wäre meine Einstellungsklasse eine Demo dafür. Da geht es ja auch darum Daten (hier Einstellungen) zur Verfügung zu haben.
http://www.delphipraxis.net/internal....php?p=1042717
Da wird eine eigene Klasse erstellt und dann werden deren Daten benutzt. Eine Demo ist ja dabei.

In deinem Fall können da dann auch direkt noch Möglichkeiten zur Sortierung oder so drin sein, je nachdem was du mit den Daten alles machen willst. Wichtig ist nur, dass die Oberfläche selbst auch nur das enthält was zur Oberfläche gehört. Das heißt die Datenlogik usw. gehört auch in die entsprechende Unit soweit möglich.

martin_ 10. Sep 2009 14:34

Re: Konzeptfrage Wertübergabe
 
Zitat:

Zitat von Klaus01
ir vielleicht entgangen ist, wird in dem Dialog auch ein neuer Wert in die Liste
aufgenommen?

Es wird bestimmt vorkommen.

@jaenicke
Danke für das Beispiel. Schaus mir gleich an.


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

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