Entwickler-Ecke
Sonstiges (Delphi) - restart the program
Trialtom - So 02.02.03 18:21
Titel: restart the program
hallo!
ich bin da grad an einem programm beschäftigt, nutze viele verschiedene edit-felder, wie auch listbox-en und labels die verändert werden....ja nachdem das programm benutz wurde sollte man nun per button klick es noch einmal benutzen können und nicht erst schließen und wieder starten.
ich könnte nun alle listbox wieder auf clear setzen und alle edit-felder wieder text:='' setzen, aber da finde ich den aufwand zu groß und den quellcode entschieden zu lang.
gibt es da ein befehl der das programm zu gut wie neu starten lässt?
danke schonmal
Tom
matze - Mo 03.02.03 17:53
das programm schliessen: application.terminate;
das programm dann starten: such nach shellexecute hier im forum !!!
deb pfad zu deinem proggi bekommst du mit paramstr(0)
Aya - Mo 03.02.03 18:07
@Matze: Is das nich nen logikfehler...?? Wie willst du denn nachdem du dein Programm mit Application.Terminate beendet hast, aus deinem Programm heraus etwas starten? *g* Dürfte nich gehen...
Ich denke mal es führt kein weg dran vorbei jedes Edit etc leer zu machen, also nen paar .Clear machen.
Wenn du deine EditFelder etc durchnummeriert hast (z.B. Edit1, Edit2, Edit3 etc) dann kannst du's auch einfach mit ner Schleife machen:
Quelltext
1: 2:
| for i:=1 to 3 do TEdit(FindComponent('Edit'+IntToStr(i))).Clear; |
Au'revoir,
Aya~
Trialtom - Mo 03.02.03 20:23
schade, aber naja, einige dieser schleifen (editfelder+listboxen) sind dann nat. sehr nützlich.
danke
overmoon - Mo 03.02.03 23:57
@Aya
Ich denke schon, dass matze recht hat.
Folgende Prozedur sollte eigentlich einen Neustart bewirken:
Quelltext
1: 2: 3: 4: 5:
| procedure TFormMain.Neustarten; begin WinExec(pChar(ParamStr(0)),SW_SHOW); Close; end; |
:idea:
Aya - Di 04.02.03 00:34
ok, in der reihenfolge funktioniert es sicherlich...
Aber für wirklich optimal halte ich die Lösung keineswegs... im idealfall wenn man alles berücksichtigt, verschwindet das Fenster trotzdem für einen kurzen augenblick..
Und wenn man die FensterKoordinaten etc nicht speichert, rutscht es sogar ein stück zur seite :)
Au'revoir,
Aya~
Delete - Di 04.02.03 09:40
Wenn ich etwas zurücksetzen muss, schreibe ich grundsätzlich eine Prozedur/Funktion, in der eben dies alles getan wird. Diese Prozedur lässt sich jederzeit erweitern und von überall im Programm aufrufen. Auf die Weise muss man das Programm nicht beenden und neu starten und kann trotzdem immer -wenn gewünscht!- die Originaleinstellungen wiederherstellen.
Das Beenden und Neustarten halte ich also Lösung für ... sorry: unsinnig.[/code]
matze - Di 04.02.03 20:20
ich meine natürluich in der reihenfolge: erst starten dann das alte zumachen !
MasterHiggins - Do 13.02.03 13:57
Titel: peinliche Frage (?)
und schon wider muß ich ich auf einen Beitrag von Matthias beziehen :roll:
Du hast geschrieben, daß man von überall eine Prozedur erneut aufrufen kann. Mein Problem ist aber wie geht das? :oops:
Wenn ich also z.B. auf Button1.click sage
TForm1.FormCreate;
gehts nicht weil er immer den Parameter haben will, also was muß ich als "Sender" angeben?
(procedure TForm1.FormCreate(Sender: TObject);)
Danke
MasterH
Delete - Do 13.02.03 14:06
Nee, anders. Sagen wir, du erstellst eine Form-interne, private Prozedur, in der alle Einstellungen zurückgesetzt werden. Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| type TForm1 = class(TForm) { ... } private ResetAll; end;
{ ... }
procedure TForm1.ResetAll; begin Edit1.Text := ''; Edit2.Text := '';
Button1.Enabled := false;
// usw. { ... } end; |
Das ist im ersten Moment natürlich aufwändig, weil du -so!- alles manuell zurückstellen musst. Aber; wenn du´s einmal gemacht hast, kannst du diese Prozedur überall in deiner Form aufrufen.
Beim Starten, im "OnCreate".
Beim Klicken auf einen Button wie "Neu",
usw. So habe ich das gemeint. Wie gesagt: meine persönliche Meinung ist die, dass es -auf gut Deutsch!- *mist*e aussieht, wenn man das Programm beendet und neustart, nur um die Einstellungen zurückzusetzen.
Hat jemand von euch schon mal gesehen, dass sich z.B. Word beendet und neu startet, nur weil man den Standard der Toolbar wiederhergestellt hat. :roll:
MasterHiggins - Do 13.02.03 14:28
Titel: supa
ja so gehts dann.
Erstmal dickes Dankeschön.
Aber:
Kann ich keine "normalen" Prozeduren aufrufen???
z.B. Button1.click oder so??
Dann müßte ich ja alles umstricken!
und 2tes aber:
Ich erstelle alle Buttons und deren Funktion erst zur Laufzeit (lese ich aus einer ini-Datei ein). und ich habe es leider bisher noch nicht geschafft diese an einer anderen Stelle zu createn als bei Form1.create
müßte das aber theoretisch in einer eigenen Prozedur genauso funktionieren, d.h. wenn ich in form1.create lediglich meine private Prozedur form1.erzeugen oder so aufrufe?
MasterHiggins - Do 13.02.03 14:49
Titel: Noch ne Frage
Habe das Programm jetzt so umgebaut, daß es das einlesen der ini-Datei und das Eerzeugen der Buttons in einer eigenen prozedur TForm1.erzeugen macht. Funktioniert auch super,
aber ich will diese procedure jetzt auf Button1.Click in FORM2 aufrufen. Das geht aber nicht. Ich kann auf alle buttons etc in form1 zugreifen, aber nicht diese procedure. Muß ich da noch irgendwie was eintragen?
In der Implementation habe ich schon dlgmain eingetragen. Woran liegt das?
Zur info:
in Form2 kann man die ini-Datei bearbeiten, deswegen will ich natürlich das man die Änderungen gleich auf Knopfdruck bewundern kann und nciht erst nach einem Neustart des Programms
Delete - Do 13.02.03 15:16
Den Namen der Form vorher angeben:
und die Prozedur ggf. vom "private"-Teil in den Teil "public" verschieben:
Quelltext
1: 2: 3: 4: 5:
| type TForm1 = class(Form) { ... } public ResetAll; |
MasterHiggins - Do 13.02.03 15:39
In den public-Bereich zu verschieben war dann die Lösung.
Danke danke danke
Aber um noch mal auf die vorherige Frage zurückzukommen:
Kann ich nicht z.B. auf button2.click button3.click aufrufen ??
Delete - Do 13.02.03 21:31
Ja. Einfach aufrufen:
Quelltext
1:
| self.Button3Click(nil); |
Oder du nimmst den "Sender" vom Button2Click. Bevor du fragst: "self." ist das selbe wie "Form1." :)
MasterHiggins - Fr 14.02.03 09:32
Titel: Guten Morgen
TATSACHE und es funktioniert wirklich!
Den Sender des anderen Buttons zu nehmen habe ich leider nicht hingekriegt, aber egal.
Aber mal allgemeiner: Was ist denn dieser Sender und was soll der bringen?
Danke für Deine Geduld!
MasterH
Anonymous - Fr 14.02.03 10:34
Sender ist die Komponente die es gesendet hat. Zum Beispiel
Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin // end; |
Wurde die Prozedur durch den Button1 ausgeführt, dann ist der Button1 der Sender. Ich kann die Prozedur auch von einem andern Button ausführen, z.B. Button2. In der Regel ist aber die Info egal. Aber hin und wieder kann man damit auch das machen:
Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); begin if Sender = Button1 then ShowMessage('Button1 wurde geklickt') else if Sender = Button2 then ShowMessage('Button2 wurde geklickt') else ShowMessage('Sonstiges wurde geklickt'); end; |
oder
Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.Button1Click(Sender: TObject); begin if Sender is TButton then ShowMessage(TButton(Sender).Name + ' wurde geklickt') else ShowMessage('Sonstiges wurde geklickt'); end; |
Im Sender steckt also nicht nur die Info welche Komponente es ist, sondern man kann auch die Sender-Variable dazu nutzen die Komponente zu beeinflussen.
Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin if Sender is TButton then TButton(Sender).Caption := 'Hallo'; end; |
Egal welcher Butten jetzt geklickt wurde, er hat jetzt ein "Hallo" als Bezeichnung.
MasterHiggins - Fr 14.02.03 11:27
AAHHH!
jetzt bin ich schon mal ein bischen schlauer. Aber wie würde man das richtig übergeben?? Momentan mache ich es so:
Quelltext
1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin Form2.Button3Click(nil); end; |
zum übergeben des Senders müßte ich es aber irgendwie so machen oder?:
Quelltext
1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin Form2.Button3Click(TForm2.ButtonClick); end; |
Moderiert von
Tino: Code-Tags hinzugefügt.
Anonymous - Fr 14.02.03 20:53
Wenn du den Button1 als Sender weitergeben willst, dann kann man das so machen:
Quelltext
1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin Form2.Button3Click(Sender); end; |
Wenn du jetzt in der Button3Click Prozedur abfragst welcher Button geklickt wurde, dann bekommst du Button1 als Antwort. Und das obwohl es die Button3 Prozedur ist.
Du kannst auch follgendes machen:
Quelltext
1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin Form2.Button3Click(Button4); end; |
Wenn du jetzt in der Button3Click Prozedur abfragst welcher Button geklickt wurde, dann bekommst du Button4 als Antwort.
Wenn du den Button eines anderen Formulars nimmst, dann mußt du auch das Formular mitschicken:
Quelltext
1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin Form2.Button3Click(Form1.Button2); end; |
Wenn die Information egal ist, dann gibst du ein Nil an:
Quelltext
1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin Form2.Button3Click(nil); end; |
MasterHiggins - Mo 17.02.03 14:52
Korrekt!
jetzt bin ich wieder ein stückchen schlauer.
Danke an alle
MasterH
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!