Autor Beitrag
bwolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Di 13.03.07 17:39 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 13.03.07 18:14 
Vertausche einfach CreateForm in der Projektdatei. Ansonsten Form2 in OnActivate von Form1 öffnen.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
bwolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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 :

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 :

ausblenden Delphi-Quelltext
1:
2:
  frm := Tfrm.Create (Self);
  frm.Show;


im Zusammenhang mit dem hier :

ausblenden 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.

_________________
Gruß
Hansa
bwolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: 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
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 15.03.07 11:33 
user profile iconbwolf hat folgendes geschrieben:
ausblenden 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:

_________________
Gruß
Hansa
bwolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Do 15.03.07 13:07 
user profile iconhansa 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.
Einloggen, um Attachments anzusehen!