AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Daten zwischen dynamisch erstellten Formularen austauschen
Thema durchsuchen
Ansicht
Themen-Optionen

Daten zwischen dynamisch erstellten Formularen austauschen

Ein Thema von megaburger2504 · begonnen am 21. Apr 2014 · letzter Beitrag vom 21. Apr 2014
Antwort Antwort
megaburger2504

Registriert seit: 14. Nov 2006
1 Beiträge
 
FreePascal / Lazarus
 
#1

Daten zwischen dynamisch erstellten Formularen austauschen

  Alt 21. Apr 2014, 14:37
Hallo liebe Community,

nachdem mir die SuFu bisher immer weiterhelfen konnte, muss ich mich diesmal dirket an Euch wenden

Die "Vorgeschichte":
Von einem Hautpformular (frmMain) kann, mit Click auf einen Button, ein Unterformular (frmKind1) mit
Delphi-Quellcode:
frmKind := TFrmKind.Create( Self );
frmKind.Show;
zur Laufzeit erzeugt und angezeigt werden.
Von frmKind1 aus kann, analog zu frmKind1, ein weiteres Unterformular (frmKind2) erzeugt und angezeigt werden.

Das Problem:
frmKind2 enthält ein Editfeld (edit1), dessen Inhalt an einen, auf frmKind1 befindlichen, ListView (lv) übergeben werden soll. Dazu ist in der Unit zu frmKind1 eine Prozedur zur Datenübergabe (siehe folgende Code) hinterlegt, die von frmKind2 aus aufgerufen wird.
Bei Aufruf der Prozedur gibt es eine Fehlermeldung/ Zugriffverletzung.
Delphi-Quellcode:
//Die Übergabeprozedur
procedure TfrmChild1.Datenuebergabe( String1: String );
var
  lvItem: TListItem;
begin
  lvItem := lv.Items.Add; //<-- An dieser Stelle gibt es eine Exception.
  lvitem.Caption := String;
end;

//Prozeduraufruf
procedure TfrmChild2.Button1Click( Sender: TObject );
begin
   frmChild1.Datenuebergabe( edit1.text );
end;
Was mache ich diesem Fall falsch bzw. wie kann ich die Datenübergabe elegant gestalten?

LG und vielen Dank im Voraus für Eure Antworten.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Daten zwischen dynamisch erstellten Formularen austauschen

  Alt 21. Apr 2014, 15:00
Hi,
du könntest Events benutzen. Funktioniert super und ist meines Erachtens nach eine gute (oder wie du es nennst "elegante") Lösung.

Geändert von Aviator (21. Apr 2014 um 15:26 Uhr) Grund: Fehler korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.467 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Daten zwischen dynamisch erstellten Formularen austauschen

  Alt 21. Apr 2014, 15:20
Die "Vorgeschichte":
Von einem Hautpformular (frmMain) kann, mit Click auf einen Button, ein Unterformular (frmKind1) mit
Delphi-Quellcode:
frmKind := TFrmKind.Create( Self );
frmKind.Show;
zur Laufzeit erzeugt und angezeigt werden.
Von frmKind1 aus kann, analog zu frmKind1, ein weiteres Unterformular (frmKind2) erzeugt und angezeigt werden.

Das Problem:
frmKind2 enthält ein Editfeld (edit1), dessen Inhalt an einen, auf frmKind1 befindlichen, ListView (lv) übergeben werden soll. Dazu ist in der Unit zu frmKind1 eine Prozedur zur Datenübergabe (siehe folgende Code) hinterlegt, die von frmKind2 aus aufgerufen wird.
Bei Aufruf der Prozedur gibt es eine Fehlermeldung/ Zugriffverletzung.
Delphi-Quellcode:
//Die Übergabeprozedur
procedure TfrmChild1.Datenuebergabe( String1: String );
var
  lvItem: TListItem;
begin
  lvItem := lv.Items.Add; //<-- An dieser Stelle gibt es eine Exception.
  lvitem.Caption := String;
end;

//Prozeduraufruf
procedure TfrmChild2.Button1Click( Sender: TObject );
begin
   frmChild1.Datenuebergabe( edit1.text );
end;
Was mache ich diesem Fall falsch bzw. wie kann ich die Datenübergabe elegant gestalten?
frmChild1 in Prozedur TFrmChild2.Button1Click ist vermutlich nicht initialisiert, denn im Code weiter oben steht:
Delphi-Quellcode:
frmKind := TFrmKind.Create( Self );
frmKind.Show;
Also frmKind und nicht frmChild1.

Das erste, was ich immer nach dem Erzeugen eines neuen Formulars in Delphi mache, ist die automatisch erzeugte Variablendeklaration loeschen, so dass ich nicht in Versuchung komme sie zu benutzen. Die einzige Ausnahme dabei ist das Hauptformular der Anwendung.

Es gibt diverse Moeglichkeiten, Dein Problem eleganter zu loesen. Eine waere beispielsweise, den Listview als Parameter an TFrmChild2 zu uebergeben, z.B. als Property und ihn dort direkt anzusprechen. Aber eigentlich kann ich Aviator nur zustimmen: Events waeren hier angesagt:

Delphi-Quellcode:
type
  TAddItemCallback = procedure(_Sender: TObject; const _Item: string) of object;

type
  TFrmKind2 = class(TForm)
  // [...]
  private
    FCallback: TAddItemCallback;
    procedure doCallback(const _Item: string);
  public
    property Callback: TAddItemCallback read FCallback write FCallback;
  end;

procedure TFrmKind2.doCallback(const _Item: string);
begin
  if Assigned(FCallback)
    FCallback(Self, _Item);
end;

procedure TFrmKind2.btnAddClick(Sender: TObject);
begin
  doCallback(edit1.Text);
end;
und

Delphi-Quellcode:

type
  TFrmKind1 = class(TForm)
  // [...]
  private
    procedure HandleCallback(_Sender: TObject; const _Item: string);
  // [...]
  end;


procedure TFrmKind1.Button1Click(Sender: TObject);
begin
  frmKind2 := TfrmKind2.Create(Self);
  frmKind2.Callback := HandleCallback;
  frmKind2.ShowModal;
end;

procedure TFrmKind1.HandleCallback(_Sender: TObject; const _Item: string);
var
  lvItem: TListItem;
begin
  lvItem := lv.Items.Add;
  lvitem.Caption := String;
end;
(Code ungetestet, nur so runtergetippt.)

twm
Thomas Mueller
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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