Delphi-PRAXiS
Seite 2 von 2     12   

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 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 06:55 Uhr.
Seite 2 von 2     12   

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