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 Einen Button Click Event von anderem Formular aufrufen? (https://www.delphipraxis.net/167139-einen-button-click-event-von-anderem-formular-aufrufen.html)

Satyr 14. Mär 2012 23:32

Einen Button Click Event von anderem Formular aufrufen?
 
Guten Abend,

mein Problem ist folgendes: Ich habe ein Programm mit 2 Formularen. Auf dem ersten ist ein Button der Daten verarbeitet, wenn er angeklickt wird. Soweit funktioniert es. Jetzt habe ich aber auf dem 2. Formular eine Situation, in der ich gerne das Klicken auf oben genannten Button nutzen würde.
Ist einfach, dachte ich mir:

Form1.button.click;

Leider funktioniert das aber nicht. Es gibt keine Fehlermeldung oder so. Das Click Ereignis vom Button wird schlicht nicht ausgeführt.
Wenn ich aber per Hand bzw. Maus auf den Button klicke, funktioniert es.

Was läuft da schief?
Ich habe das onClick Event eines Buttons schon öfter fremdbenutzt. Allerdings immer vom gleichen Formular aus. Da hatte ich nie Probleme. Was also jetzt?

Gruß,
Andreas

Popov 14. Mär 2012 23:43

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Evtl. so:

Delphi-Quellcode:
  Form2.Button1Click(nil);

Luckie 14. Mär 2012 23:56

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Das macht man nicht. Lager den Code von dem Button-Klick Ereignis in eine öffentliche Methode aus, die du dann von dem anderen Formular aus aufrufen kannst. Und noch besser wäre es, wenn du den Code von der Oberfläche trennst, dann hast du solche Probleme erst gar nicht.

Satyr 15. Mär 2012 00:04

AW: Einen Button Click Event von anderem Formular aufrufen?
 
@popov
Leider tut sich auch da nichts...

@Luckie
Ich weiß das dies kein schöner Code ist. Ich hatte das auch so nicht geplant. Der Button interagiert mit anderen Controls auf dem Formular (Edits und Labels). Das zweite Formular kam später als nicht geplanter Zusatz, sonst hätte ich es direkt anders aufgebaut. Anstatt jetzt alles umzuschreiben, fänd ich ein Button.Click schlicht am einfachsten und - wenn es funktionieren würde - auch die Zeitsparendste Anpassung momentan.
Deshalb ging meine Frage auch eher in die Richtung warum Delphi das nicht mag und wie man das "mal eben" umgehen könnte. Das dieser Code keinen Schönheitswettbewerb gewinnen wird, ist mir bewusst.

Luckie 15. Mär 2012 00:10

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Dann mach den Code zumindest zu einer öffentlichen Methode des Formulars, dann hast du immer noch Zugriff auf die Steuerelemente des Formulars.

Popov 15. Mär 2012 00:12

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Unabhängig dessen ob es schön ist oder nicht und man es macht oder nicht, so solle es funktionieren.

Satyr 15. Mär 2012 00:15

AW: Einen Button Click Event von anderem Formular aufrufen?
 
@Luckie
Ok, das ist ne Idee.
Probiere ich morgen als erstes, danke :).
Gibt es trotzdem nen Grund warum Delphi damit Probleme hat? Will es wenigstens nachvollziehen können...

Luckie 15. Mär 2012 00:21

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Formular2:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage('Test');
end;
Formular1:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Button1.Click;
end;
Funktioniert.

Bummi 15. Mär 2012 06:10

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Kann es sein dass hinter der Variable Form1 gar nicht das Form liegt welches Du siehst ...

himitsu 15. Mär 2012 08:13

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Zitat:

Delphi-Quellcode:
Form2.Button1Click(nil);

Wenn Form2 (sehr schöner Name) nicht existiert (keine Instanz davon), dann kann man diese Funktion nicht aufrufen.

Und welche Daten sollen denn verarbeitet werden, also wo kommen die her?

@Bummi: Ja ja, immer diese bösen globalen Variablen. :twisted:

Satyr 15. Mär 2012 16:32

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Ich hab den Fehler gefunden und weiß nicht was mich da am meisten veralbert: Delphi, Windows, meine Festplatte oder ich selbst.

Ich erkläre mal ein wenig mehr:
Der Button auf Form1 um den es geht, ändert Dateien. Er öffnet sie, schreibt was um, schließt und speichert. Funktioniert alles wie es soll.
Dann kam Form2 dazu. Dort wird nach mehreren Kriterien ein Verzeichnis gewählt, in das eben genannte Dateien kopiert werden sollen, vor dem bearbeiten DIESER Dateien.
Das kopieren funktioniert, das übergeben vom neuen Bearbeitungspfad auch. An der stelle dachte ich mir, ich mache das mit form1.button1.click; und fertig. Denn wenn ich per Hand auf diesen Button klicke, passiert genau das was passieren soll. Per Aufruf aber eben nicht.
Nun weiß ich auch wieso:
Das kopieren ist zu langsam.
Wenn der Aufruf von Button1 getätigt wird, sind die Dateien die geöffnet werden sollen noch nicht 100% fertig kopiert. Keine Fehlermeldung bekam ich weil ich die Dateioperationen schon mit if FileExists "abgesichert" hatte. Das erklärt auch warum es mit Händischem Klicken funktionierte. Es dauert schlicht einige Millisek. länger, bis ich geklickt habe.

Wenn ich if FileExists weg lasse, bekomme ich die Fehlermeldung "File not found". Wenn ich einen Delay von min. 250 millisek. einbaue, funktioniert alles. Sind es weniger als die 250millisek. dann nicht.
Für mich kein Problem das so zu lösen... aber ist das dann nicht arg abhängig von der Geschwindigkeit der Platte?

himitsu 15. Mär 2012 17:40

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Zitat:

Zitat von Satyr (Beitrag 1156759)
aber ist das dann nicht arg abhängig von der Geschwindigkeit der Platte?

Frag uns doch nicht, denn wir wissen ja nicht, was DU mit den Dateien machst. (hat uns ja keiner verraten)

Satyr 15. Mär 2012 17:52

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Nichts aufwändiges.

Sind HTML Dateien die ich in ein Memo lade (weil ich will das man sieht welche Datei grade bearbeitet wird), einige Strings ersetze und wieder speichere. Mehr nicht.

himitsu 15. Mär 2012 18:19

AW: Einen Button Click Event von anderem Formular aufrufen?
 
FileStreams und auch das SaveToFile haben ihre Arbeit schon fertig, wenn der Befehl beendet ist.
Pausen gibt es da nicht, egal wie langsam die Platte ist, vorallem da alle diese Dateibefehle (standardmäßig) über WindowsFileCache umgeleitet werden, außer wenn die Cache explizit dektiviert wurde, aber auch da sind sie erst dann zurück, wenn sie irgendwann fertig sind.

Satyr 15. Mär 2012 18:29

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Aber schon das LoadFromFile gibt ne Fehlermeldung (File not found) aus, wenn ich keine Pause davor einbaue. Mit Pause klappt es, der Code der ausgeführt werden soll, scheint also im Grunde zu stimmen.
Ich kann es mir nur mit zu langsamen schreiben auf die Platte erklären. Also nicht damit das die WinApi hier zu langsam wäre, sondern die weiterverarbeitung der Hardware, quasi...

himitsu 15. Mär 2012 19:51

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Nochmals:

Wenn man nicht absichtlich asynchrone Dateioperationen verwendet oder mit Multithreading rumpfuscht, dann sind sie immer fertig, wenn der Befehl abgearbeitet wurde.
Das ist ja grade der Sinn einer synchronen Arbeitsweise.

Wie schnell die Festplatte ist, ist vollkommen egal. Standardmäßig wird alles über die WindowsFileCache umgeleitet.
Außer man arbeitet absichtlich mit NonBuffered-Dateioperationen oder der Datenträger ist explizit als NonCached konfiguriert. (wie z.B. USB-Sticks, welche für "schnelles Entfernen" konfiguriert sind)

Die Datei landet erstmal in der WFC und wird eventuell erst später vollständig auf die Platte geschrieben,
aber solange das der Fall ist, werden weitere Dateioperationen auf die in der WFC liegenden Dateiteile umgeleitet.


So, solange nicht weiteres zu den genauen Dateibehandlungen gesagt wird, werde ich schweigen, da es ganz einfach nichts weiter zu sagen gibt.

hoika 15. Mär 2012 20:56

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Hallo,

die Antwort

Form2.Button1Click(nil);

war ja eh falsch,
es soll ja der Button 1 von Form1 aufgerufen werden.

Aber trotzdem.
Was ist so schlimm daran, in TForm1 eine public-Methode ToWas
zu definieren, und in Button1Click

procedure TForm1.Button1Click(Sender: TObject);
begin
TuWas;
end;

in Form2 rufst du dann Form1.TuWas auf.



Heiko

Satyr 16. Mär 2012 11:13

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Heiko, genau das tue ich ja. Aber es klappt wie geschrieben an anderer Stelle nicht :).

Ich suche heute Nachmittag/Abend mal Code raus und poste ihn, wenn ich zu Hause bin.

Satyr 16. Mär 2012 17:15

AW: Einen Button Click Event von anderem Formular aufrufen?
 
Also, auf Form2 macht eine Procedure folgendes:

Delphi-Quellcode:
[..]
if bsSkinSelectDirectoryDialog1.Execute then
      begin
choosenDirectory := bsSkinSelectDirectoryDialog1.Directory;
tempName := ListBox1.Items[ListBox1.ItemIndex];
Form1.exportTo.Caption := choosenDirectory;
tempNameDir := Form1.programmdirectory.Caption+'..\webTemplates\'+tempName;
if func.CopyDir(tempNameDir, choosenDirectory) = True then begin
          [B]Form1.Button1.Click;[/B]
          ShowMessage('Export successfully!');            ShellExecute(handle,'open',PChar(choosenDirectory+'\index.html'),nil,nil, SW_SHOWNORMAL);
          Close;
         end;
        end;
[..]
Auf Form1 soll Button1 folgendes machen:

Delphi-Quellcode:
AdvMemo1.Lines.Clear;
AdvMemo1.Lines.LoadFromFile(exportTo.Caption+'index.html');
AdvMemo1.Lines.Text := StringReplace(AdvMemo1.Lines.Text,'$title', titleEdit.text,[rfReplaceAll]);
[..]
AdvMemo1.Lines.SaveToFile(exportTo.Caption+'index.html');
Ich habe das etwas gekürzt. Der StringReplace wird 20 mal mit verschiedenen Ersetzungssachen aufgerufen.
Form2 hat ListBox1 in welcher man verschiedene WebDesign Vorlagen wählen kann. Diese Vorlage wird dann in ein vom User gewählter Verzeichnis kopiert. Der Button1 auf Form1 bearbeitet die index.html aus dieser WebVorlage dann und passt sie wie gewünscht an.

Ich weiß, das ist kein hübscher Code und ich hätte es anders machen können - sicher auf 100 verschiedene Arten. Aber die WebExport Funktion in der Art wurde vom User erst nachträglich gewünscht. Es gab zwar vorher schon den WebExport (ist ne DB Anwendung) aber nicht mit Vorlagenwahl und sowas.


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