Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Instanzierte Formulare ermitteln (https://www.delphipraxis.net/158276-instanzierte-formulare-ermitteln.html)

coderi 11. Feb 2011 10:38

Instanzierte Formulare ermitteln
 
Hallo zusammen,

folgendes Problem :
ich rufe 3 mal die procedur auf:

procedure Tdmbspiel.showformular(caption:String);
begin
frmNormal := TfrmNormal.Create(Self,caption);
frmNormal.Show;
end;

Jetzt habe ich 3 mal das gleiche formular mit dem gleichen formularnamen, unterschiedlichen captions.

Hintergrund: Ich pflege stammdaten, welche immer die gleiche struktur haben, will aber nur ein
formular dafür haben.

Wie kann ich nun verhindern, dass ein formular mit der gleichen caption nicht zweimal aufgeht?

Nochmal: Ich möchte nicht showmodal haben, showmodal würde nur zum einmaligen öffnen des formulares führen. Ich brauch das ding parallel, aber nur einmal pro bereich offen.

'Caption1' = offen; 'Caption2' = offen. beim erneuten aufruf von create(self,'caption2') soll nix passieren.


ich hoffe ich habe ausführlich erklärt auf was ich hinausmöchte. Ich habe also ein instanziertes formular und möchte quasi das formular, wenn es mit den bedinungen schon offen ist, nicht nochmal öffnen können.


danke vorab für infos und hilfe
coderi

DelphiBandit 11. Feb 2011 10:45

AW: Instanzierte Formulare ermitteln
 
Vielleicht hilft Dir dieser Schnipsel - ist bei uns zum Schauen, ob es Modal irgendwo auf ist:

Delphi-Quellcode:
for I := 0 to Screen.FormCount - 1 do
  if (ansiUpperCase(Screen.Forms[I].Caption) = ansiUpperCase(UeCaption)) then
  begin
    ..Nicht mehr öffnen, nach vorne holen
  end;

shmia 11. Feb 2011 15:18

AW: Instanzierte Formulare ermitteln
 
Folgende Procedure prüft, ob ein Formular schon offen ist und erzeugt es ggf. neu:
Delphi-Quellcode:
function FindOrCreateForm(FormClass: TFormClass; var Reference):Boolean;
var
   i : Integer;
begin
   for i := Screen.CustomFormCount-1 downto 0 do
   begin
      if Screen.CustomForms[i].ClassType = FormClass then
      begin
         TCustomForm(Reference) := Screen.CustomForms[i];
         Result := True; // gefunden
         Exit;
      end;
   end;
   Application.CreateForm(FormClass, Reference);
   Result := False; // neu erzeugt
end;

arc 12. Feb 2011 21:03

AW: Instanzierte Formulare ermitteln
 
Zitat:

Zitat von coderi (Beitrag 1081024)
procedure Tdmbspiel.showformular(caption:String);
begin
frmNormal := TfrmNormal.Create(Self,caption);
frmNormal.Show;
end;

ich hoffe ich habe ausführlich erklärt auf was ich hinausmöchte. Ich habe also ein instanziertes formular und möchte quasi das formular, wenn es mit den bedinungen schon offen ist, nicht nochmal öffnen können.

Das klingt für mich nach einem hausgemachten Design Problem. frmNormal wird duch erneuten Aufruf dieser Routine überschrieben, besser wäre es diesen Zeiger zu speichern - dann hast du später noch Zugriff auf dein Form. Du könntest so z.B. die erzeugten Formulare in einer TList speichern. Dann könntest du beim nächsten mal nachschauen, ob es bereits existiert. Wenn es statisch sein soll, kannst du dir auch einfach 3 Variablen anlegen und prüfen ob sie nil sind (natürlich die Forms dann mit FreeAndNil() zerstören).

Folgender Schnipsel erzeugt das Form wenn es nicht existiert und löscht es, wenn es existiert. Kannst du ja entsprechend abändern.
Delphi-Quellcode:
if frmNormal = nil then
begin
  frmNormal := TfrmNormal.Create(Self,caption);
  frmNormal.Show;
end
else
begin
  frmNormal.Hide;
  FreeAndNil(frmNormal);
end;

Blup 16. Feb 2011 12:14

AW: Instanzierte Formulare ermitteln
 
Formulare sollten nicht mit Free oder FreeAndNil() freigegeben werden, sondern mit Release.
Grund steht in der Delphi-Hilfe zu Release.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.

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