AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

(Formular-)Handling größerer Projekte

Ein Thema von mm1256 · begonnen am 11. Mär 2015 · letzter Beitrag vom 13. Mär 2015
Antwort Antwort
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 12:41
Die modalen Fenster sind ja abgehakt. Es geht ja um nicht modale Fenster. Das ist ja mein aktueller Ansatz (siehe Eröffnung des Thread) aber dann kannst du eben nicht mehr auf "Formvariable = nil" bei der Erstellung prüfen, und brauchst die Hilfsvariable.

Oder du erzeugst mit jedem Aufruf ein neues Formular, anstatt das bestehende anzuzeigen. Wenn du das willst, dann brauchst du ja gar keine Formularvariable:

Delphi-Quellcode:
  With TFrmClient1.Create(Application) do Show;

rocedure TFrmClient1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 13:01
Oder du erzeugst mit jedem Aufruf ein neues Formular, anstatt das bestehende anzuzeigen. Wenn du das willst, dann brauchst du ja gar keine Formularvariable:

Dazu überprüfe ich das Anwendungsobjekt, ob bereits irgendeine Instanz des Fensters erzeugt wurde:

Delphi-Quellcode:
function ShowFormOnce(AFormClass: TComponentClass): TForm;
var
  liZ1: Integer;
begin
  Result := nil;
  for liZ1 := 0 to Application.ComponentCount-1 do
   begin
    if (Application.Components[liZ1] is AFormClass) then
     begin
      Result := TForm(Application.Components[liZ1]);
     end;
   end;

  if (Result = nil) then
   begin
    Result := TForm(AFormClass.Create(Application));
   end;

  Result.Show;

end;
wobei "AFormClass" die Klasse des entsprechenden Fensters ist.

Existiert eine Instanz, dann wird diese angezeigt anderenfalls wird eine Instanz erzeugt und danach angezeigt.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.

Geändert von BadenPower (12. Mär 2015 um 14:05 Uhr) Grund: Abfrage berichtigt
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 13:31
Interessanter Ansatz. Werde ich mal nachverfolgen. Zu deinem Code-Beispiel...da fehlt natürlich noch eine Kleinigkeit:

Delphi-Quellcode:
function ShowFormOnce(AFormClass: TComponentClass): TForm;
var
  liZ1: Integer;
begin
  Result := nil;
  for liZ1 := 0 to Application.ComponentCount-1 do
   begin
    if (Application.Components[liZ1] is AFormClass) then
     begin
      Result := TForm(Application.Components[liZ1]);
     end;
   end;

  if (Result <> nil) then
   begin
    Result := TForm(AFormClass.Create(Application));
   end;
  if Assigned(Result) then // sonst knallts !!!!
  Result.Show;

end;
EDIT: Mal "nachverfolgt". Würde dann so aussehen:

Delphi-Quellcode:
{-Interface-procedure zum Anzeigen der Form-}
procedure FrmClient1_Show;
var
  i: Integer;
begin
  for i := 0 to Pred(Application.ComponentCount)
  do if (Application.Components[i] is TFrmClient1) then
  begin
    TFrmClient1(Application.Components[i]).Show;
    Exit;
  end;
  with TFrmClient1.Create(Application) do Show;
end;

procedure TFrmClient1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Einwände? - Verbesserungsvorschläge?
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen

Geändert von mm1256 (12. Mär 2015 um 13:41 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 13:54
[QUOTE=mm1256;1293209]
Delphi-Quellcode:
  if (Result = nil) then
   begin
    Result := TForm(AFormClass.Create(Application));
   end;
  if Assigned(Result) then // sonst knallts !!!!
  Result.Show;
Wenn Du hier Angst hast, dass es knallt und deshalb die Assigned-Abfrage eingefügt hast, dann darfst Du das unten auch nicht so machen:

  with TFrmClient1.Create(Application) do Show; .
EDIT:
Da war ein Fehler in der Abfrage
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.

Geändert von BadenPower (12. Mär 2015 um 14:06 Uhr) Grund: Abfrage berichtigt
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 14:01
Dazu kommt es doch gar nicht, denn denn wäre ja
Code:
Application.Components[i] is TFrmClient1
schon FALSE
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 14:09
Hi mm1256

Alternativ könntest du die Clientforms, die du zur Laufzeit erstellst, auch in eine (generische?) Objektliste stecken, dann müsstest du nicht alle Komponenten der Anwendung durchlaufen, sondern nur den Listeninhalt. Solltest du eine ältere Delphiversion haben, die noch keine Objectlisten kennt, kannst du auch ein TList-Objekt benutzen und da einen Zeiger ablegen.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 14:15
Hi mm1256

Alternativ könntest du die Clientforms, die du zur Laufzeit erstellst, auch in eine (generische?) Objektliste stecken, dann müsstest du nicht alle Komponenten der Anwendung durchlaufen, sondern nur den Listeninhalt. Solltest du eine ältere Delphiversion haben, die noch keine Objectlisten kennt, kannst du auch ein TList-Objekt benutzen und da einen Zeiger ablegen.

Gruss
Delbor
Dafür nimmt man Delphi-Referenz durchsuchenSystem.Contnrs.TComponentList, denn dafür wurde die gebaut
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 14:15
Hi mm1256

Alternativ könntest du die Clientforms, die du zur Laufzeit erstellst, auch in eine (generische?) Objektliste stecken, dann müsstest du nicht alle Komponenten der Anwendung durchlaufen.....
Danke für den Tipp. Application.ComponentCount hab ich natürlich vorher mal getestet, weil, Performance möchte ich nach Möglichkeit nicht verschenken. Auch wenn's nur Kleinigkeiten sind. Es scheint so zu sein, dass Application.ComponentCount nur die Anzahl der aktiven Fenster beinhaltet. Weil ich diese ja immer wieder freigebe, wenn sie nicht mehr gebraucht werden, dürfte Application.ComponentCount i.d.R. nicht viel größer als 10 sein. Ich denke, das ist also keine Spassbremse

EDIT

Dafür nimmt man Delphi-Referenz durchsuchenSystem.Contnrs.TComponentList, denn dafür wurde die gebaut
Geil, was ihr so alles wisst. Das kannte ich noch gar nicht.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen

Geändert von mm1256 (12. Mär 2015 um 14:18 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#9

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 14:27
dann müsstest du nicht alle Komponenten der Anwendung durchlaufen,
Über wieviele Millisekunden reden wir hier?

Du gehst ja nicht alle Komponenten der Anwendung durch, sondern wie Sir Rufo schon richtig angemerkt hat, nur die Komponenten deren Owner "Application" ist.
Und dies sind eben meistens nur die Formulare.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz