Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Nach Programmstart Focus auf andere Form setzen
bwolf - Di 13.03.07 17:39
Titel: Nach Programmstart Focus auf andere Form setzen
Hi Leuts,
dumme Frage, aber wie kann ich nach dem Programmstart eine andere Form als die Mainform aktiv setzen bzw. den Focus geben ?
Hab es im 'onCreate' und im 'onShow'-event der Mainform probiert, und in der Projekt-File, aber leider immer ohne Erfolg.
Danke für eure Hilfe!
GTA-Place - Di 13.03.07 18:14
Vertausche einfach CreateForm in der Projektdatei. Ansonsten Form2 in OnActivate von Form1 öffnen.
bwolf - Mi 14.03.07 12:35
Hi,
danke für die Antwort.
Also die erste form die erstellt wird, ist doch die Mainform oder?
Ist es egal, wenn ich diese einfach vertausche ?
Zum onActivate:
Wenn ich im onActivate der MainForm der anderen Form den Focus gebe, komm ich ja nicht mehr auf die Mainform, da ja jedes mal wenn diese geklickt wird, onActivate ausgeführt wird.
hansa - Mi 14.03.07 13:24
Du musst aufpassen mit der Reihenfolge ! Zuerst kommt FormCreate, dann FormShow. Dann FormPaint und schließlich FormActivate und dann wieder FormPaint.
Lege mal ein solches Projekt an und guck selber :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormPaint(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin showmessage ('FormCreate'); end;
procedure TForm1.FormActivate(Sender: TObject); begin showmessage ('FormActivate');
end;
procedure TForm1.FormShow(Sender: TObject); begin showmessage ('FormShow');
end;
procedure TForm1.FormPaint(Sender: TObject); begin showmessage ('FormPaint'); end;
end. |
Gerade das FormPaint ist gefährlich. Selbst wenn nur ein Button disabled wird, wird der darin befindliche Code immer ausgeführt und die Form neu dargestellt. Folge : flackern, Programm wird langsam usw. Spezialisten kriegen es locker hin, die Prozessorauslastung auf 99,9999 % zu schrauben. :mrgreen:
Abhilfe bietet das :
Delphi-Quelltext
1: 2:
| frm := Tfrm.Create (Self); frm.Show; |
im Zusammenhang mit dem hier :
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure Tfrm.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; |
Dadurch behält man ziemlich die Kontrolle ohne unerwünschte Quereffekte. Zusätzlich sollte noch bei Projekt -> Optionen -> Formulare unter "automatisch erzeugen" nur die erste anzuzeigende Form stehen. Ansonsten nur noch nichtvisuelle Sachen, die schon beim Programmstart gebraucht werden, z.B. DataModule.
bwolf - Do 15.03.07 11:04
Hi Hansa, danke für deine Erklärung!
Bisher hatte ich es so, das der Großteil meiner Forms zu Programmstart erstellet werden. Ich weiß, das kostet viel Speicher, und ich habe auch vor das zu ändern.
Hierzu allerdings eine Frage:
Ich habe eine Form, die im onCreate relativ viele Controls erstellt.
Wenn ich diese Form mit
Delphi-Quelltext
1:
| frm_printer := TFrm_Printer.Create(frm_printer); |
erstelle, kann ich mit findComponent nicht mehr auf die zur Laufzeit estellten Controls zugreifen. (Access Violation)
Wenn ich diese Form aber mit
Delphi-Quelltext
1:
| Application.CreateForm(Tfrm_printer, frm_printer); |
erstelle, klappt das problemlos.
Könnte mir jemand erklären, warum das so ist ?
Danke für eure Mühe,
grüße ben
hansa - Do 15.03.07 11:33
bwolf hat folgendes geschrieben: |
Delphi-Quelltext 1:
| frm_printer := TFrm_Printer.Create(frm_printer); |
erstelle, kann ich mit findComponent nicht mehr auf die zur Laufzeit estellten Controls zugreifen. (Access Violation).. |
Die Forms zur Laufzeit zu erstellen lasse ich mir ja noch gefallen. Aber Du erzeugst die Controls darauf auch zur Laufzeit ? Wozu dieser gewaltige Umweg ? Um für kurze Zeit 2,5 Byte zu sparen ? :shock:
bwolf - Do 15.03.07 13:07
hansa hat folgendes geschrieben: |
Die Forms zur Laufzeit zu erstellen lasse ich mir ja noch gefallen. Aber Du erzeugst die Controls darauf auch zur Laufzeit ? Wozu dieser gewaltige Umweg ? Um für kurze Zeit 2,5 Byte zu sparen ? :shock: |
Hi nochmal ;)
Nein, ich mache das nicht um Speicher zu sparen.
In dem Programm kann man gewisse Vorlagen mit Druckern verknüpfen.
Die Pfadangaben zu den Vorlagen werden in einer Datenbank gespeichert, und der Benutzer beliebig viele davon erzeugen.
Wenn die Form erstellt wird, lese ich aus der Datenbank aus, wieviele Verknüpfungen bestehen, und erstelle entsprechend die Controls dazu.
Auch wenn ein User zur Laufzeit eine neue Verknüpfung erstellen will, muß ich ja die entsprechenden Controls erzeugen.
Ich hab mal einen Screen drangehängt, damit das vieleicht etwas klarer wird.
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!