Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Kontrolle ob ein Fenster bereits geöffnet ist (https://www.delphipraxis.net/151335-kontrolle-ob-ein-fenster-bereits-geoeffnet-ist.html)

bezarre 13. Mai 2010 16:49


Kontrolle ob ein Fenster bereits geöffnet ist
 
Hallo,

ich habe ein kleines Problem, dass ich einfach nicht gelöst kriege.
Folgende Situation herscht:

Ein User kriegt eine Liste von Inhalten angezeigt. Auf jedes Item dieser Liste kann er klicken und es öffnet sich dann eine Detailansicht. Es soll aber nicht möglich sein, für z.B. Bild 1 die Detailansicht doppelt zu öffnen.

Delphi-Quellcode:


procedure TForm1.ListView1DblClick(Sender: TObject);
var
detail: TForm3;
begin
  if Assigned(ListView1.Selected) then
  begin
    if (user_id <> '0') then
     begin
        detail := TForm3.Create(self);
        detail.load(ListView1.ItemIndex);
        detail.Show;
     end;
  end;
end;
Wie finde ich jetzt heraus, ob der User schon eine Detailsansicht mit dem jeweiligen ItemIndex geöffnet hat? Ich habe auch scohn folgendes probiert gehabt:
Ich habe ein globals Array definiert
Delphi-Quellcode:
var
   detail : Array [0..100000] of TForm3;
Und habe dann mit der gleichen Funktion wie oben (außer das dort keine lokale Variable definiert ist), das Ganze geöffnet.
Delphi-Quellcode:
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
  if Assigned(ListView1.Selected) then
  begin
    if (user_id <> '0') then
     begin
        detail[ListView1.ItemIndex] := TForm3.Create(self);
        detail[ListView1.ItemIndex].load(ListView1.ItemIndex);
        detail[ListView1.ItemIndex].Show;
     end;
  end;
end;
Nun hatte ich mir hier gedacht, dass ich vielleicht irgendwie das Array kontrollieren könnte ob das jeweilige Feld belegt wurde, ich weiß aber nicht wie. Was mich hierbei aber am meisten stört, ist das ich auf ein beschränktes Array angewiesen bin.
SetLength hat hier leider nicht funktioniert, da sich die Liste regelmäßig updated und die Länge daher bei jedem Update beliebig verändert wird.

Ich hoffe sehr ihr könnt mir helfen und versteht mein Problem.

Gruß
Micha

PS Weiß jemand, wie es möglich ist, bei Windows 7 in der Startleiste, beim klicken auf das Icon Aktionen anzuzeigen?

Teekeks 13. Mai 2010 17:12

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Nur so: Hast du eine Ahnung wie viel Speicherplatz 100000 Formen benötigen?

Nimm lieber ein Dynamisches Array, dann belegst du auch wirklich nur soviel Platz wie du benötigst...

bezarre 13. Mai 2010 17:27

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Hallo,

ja ich weiß, aber ich schreib auch, dass SetLength leider einen Fehler auslöste.

// Edit
Habe es nochmal probiert, und jetzt funktioniert es mit dem dynamischen Array :-) Die Hauptfrage bleibt weiterhin offen

Gruß
Micha

Luckie 13. Mai 2010 18:02

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Zitat:

Zitat von bezarre
ja ich weiß, aber ich schreib auch, dass SetLength leider einen Fehler auslöste.

Man könnte ja versuchen den Fehler zu finden. ;) Aber generell würde ich das Konzept noch mal überdenken. Muss es denn für jeden Eintrag ein neues Fenster sein? Reicht es nicht immer das selbe Fenster zu nehmen und nur eben die entsprechenden Daten zu übergeben?

bezarre 13. Mai 2010 18:04

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Hallo,

nein das reicht nicht. Das habe ich bewusst so gewählt.

Gruß
Micha

Luckie 13. Mai 2010 18:11

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Begründe das mal. Eventuell findet sich eine bessere Lösung.

bezarre 13. Mai 2010 18:14

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Hallo,

weil es sich hierbei um ein kleines Chatsystem handeln soll und man auch mit mehr als einer Person sprechen können soll ;-)

Ist ja nicht so cool, dass man wenn man sich ein anderes Bild angucken will und mit dem Ersteller chatten will, das Chatten mit einem anderen Abrechen muss bzw. von diesem weggerissen wird. Oder?
Hatte schon überlegt, das mit Registerkarten zulösen, fand das aber nicht so schön.

Gruß
Micha

Luckie 13. Mai 2010 18:20

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Da reicht doch ein Formular aus. Für jeden Chatpartner wird es neu dynamisch erstellt mit den zugehörigen Daten für die Chatpartner.

bezarre 13. Mai 2010 18:24

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Hallo,

das verstehe ich jetzt nicht.

Mehr mache ich doch jetzt auch nicht. Er gibt oben einen Bereich, in dem das Bild ist, darunter ist ein Feld in dem der Chatverlauf steht und darunter ein Eingabeformular.

Gruß
Micha

sx2008 13. Mai 2010 18:52

Re: Kontrolle ob ein Fenster bereits geöffnet ist
 
Es gibt also nur eine Formularklasse (mit dem nichtssagenden Namen TForm3 - bitte ändern!) aber davon mehrere Instanzen?
Dann mach's doch so:

Delphi-Quellcode:
// suche Formular
function TForm1.FindMyForm(const value:string):TForm;
var
  i : integer;
  f : TForm3;
begin
  for i := ComponentCount-1 to 0 do  // Suche von "hinten" beginnen,höhere Wahrscheinlichkeit die Formulare schnell zu finden
  begin
    if Components[i] is TForm3 then
    begin
      f := TForm3(Components[i]);
      if f.Caption = Value then
      begin
        Result := f;
        exit;
      end;
    end;
  end;
  Result := nil;
end;

procedure TForm1.FindOrCreateForm(const value:string);
var
  detail : TForm3;
begin
  detail := FindMyForm(value) as TForm3;
  if Assigned(detail) then
    detail.BringToFront  // Formular schon vorhanden -> anzeigen
  else
  begin
    // Formular nicht vorhanden -> erzeugen
    detail := TForm3.Create(self);
    detail.load(value); // hier String statt Index übergeben
    detail.Caption := value;
    detail.Show;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.
Seite 1 von 2  1 2      

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