Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TForm mit BorderStyle=bsNone Frage (https://www.delphipraxis.net/166319-tform-mit-borderstyle%3Dbsnone-frage.html)

RWarnecke 7. Feb 2012 21:46

TForm mit BorderStyle=bsNone Frage
 
Hallo zusammen,

ich habe auf einer Form eine Listview und eine Auswahlliste. Wenn ich in der Listview auf einen Eintrag einen Doppelklick ausführe, wird eine zweite Form mit der Eigenschaft BorderStyle=bsNone erstellt und über die Listview gelegt. Ich benutze die TForm sozusagen als eine Art Frame. Über einen Button kann ich die erstellte Form, die über der Listview liegt wieder schliessen. Wenn ich jetzt in der Auswahlliste, die zusätzlich zur Listview oder zur erstellten Form angezeigt wird, einen Eintrag auswähle, soll sich der Inhalt der Listview ändern. Bis hier funktioniert alles wunderbar.

Jetzt zu meinem Problem :
Wenn nicht die Listview zu sehen ist, sondern die erstellte Form, soll diese vorher geschlossen werden und dann die Listview wieder angezeigt werden. Ich habe das ganze versucht über die Eigenschaft Showing der erstellten Form abzufangen. Nur leider wird diese Eigenschaft auch dann True gesetzt, wenn die erstellte Form über die Procedure Close geschlossen wird.

Also kommt meines Erachtens die Eigenschaft Showing nicht in Frage. Wie könnte ich es trotzdem realisieren, dass die erstellte Form erst geschlossen wird und dann der neue Inhalt der Listview entsprechend dem Eintrag in der Auswahlliste angezeigt wird ? Ein Wechsel zwischen den einzelen Einträgen der Auswahlliste sollte immer Funktionieren.

Gruß
Rolf

Uwe Raabe 7. Feb 2012 22:26

AW: TForm mit BorderStyle=bsNone Frage
 
Ich bin nicht sicher, ob ich dich richtig verstanden habe, aber was spricht gegen
Delphi-Quellcode:
Form.Visible
?

EWeiss 7. Feb 2012 22:28

AW: TForm mit BorderStyle=bsNone Frage
 
Die Frage wäre warum mußt du die Borderlose Form schließen reicht hier nicht ein Hide?

gruss

Uwe Raabe 7. Feb 2012 22:31

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Zitat von EWeiss (Beitrag 1149756)
Die Frage wäre warum mußt du die Borderlose Form schließen reicht hier nicht ein Hide?

Delphi-Quellcode:
procedure TCustomForm.Hide;
begin
  Visible := False;
end;
:gruebel:

EWeiss 7. Feb 2012 22:38

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1149757)
Zitat:

Zitat von EWeiss (Beitrag 1149756)
Die Frage wäre warum mußt du die Borderlose Form schließen reicht hier nicht ein Hide?

Delphi-Quellcode:
procedure TCustomForm.Hide;
begin
  Visible := False;
end;
:gruebel:

Lieber Uwe schon klar..
mein Problem dabei du hast ein paar Minuten vor mir gepostet so konnte ich deinen Beitrag erst nachher sehn ;)

gruss

RWarnecke 7. Feb 2012 23:09

AW: TForm mit BorderStyle=bsNone Frage
 
Hallo Ihr beiden,

danke erstmal für Eure Antworten. Ich weiß nicht, ob es eine entscheidene Rolle spielt, aber ich setzte den BorderStyle erst zur Laufzeit. Wenn ich euch richtig verstanden habe, dann soll ich die Forms, die im Moment durch einen Doppelklick auf einen ListView-Eintrag erstellt werden, beim Starten des Programms erstellen oder ? Damit ich dann später nur noch mit Hide und Show/ShowModal die Forms anzeigen oder verschwinden lassen kann ?

Edit: Hier noch ein Sourcecodeteil wie ich erstelle :
Delphi-Quellcode:
BillingDetails := TCreateBillingForm.Create(Self);
BillingDetails.Parent := Self;
BillingDetails.BorderStyle := bsNone;
for I := 0 to BillingDetails.ComponentCount - 1 do
  if (BillingDetails.Components[i] is TAdvEdit) then
    TAdvEdit(BillingDetails.Components[i]).ReadOnly := True;
{...}
BillingDetails.Show;
Dieser Teil wird in meiner MainForm des Programms ausgeführt, wenn auf einen Eintrag in der ListView ein Doppelklick ausgeführt wird.

EWeiss 7. Feb 2012 23:21

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Damit ich dann später nur noch mit Hide und Show/ShowModal die Forms anzeigen oder verschwinden lassen kann ?
So war das gedacht.

Ich Händle das mit meinen nonvcl Windows genau so.

gruss

RWarnecke 7. Feb 2012 23:24

AW: TForm mit BorderStyle=bsNone Frage
 
Wenn ich aber nur Hide und Show/ShowModal benutze, habe ich ja immer noch die ganzen Eingaben in der Form stehen. Das heißt also, Du löscht dann prinzpell alles beim Verstecken oder vor dem Anzeigen wieder ? Wenn ja, ist das nicht etwas umständlich ?

EWeiss 7. Feb 2012 23:29

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Zitat von RWarnecke (Beitrag 1149778)
Wenn ich aber nur Hide und Show/ShowModal benutze, habe ich ja immer noch die ganzen Eingaben in der Form stehen. Das heißt also, Du löscht dann prinzpell alles beim Verstecken oder vor dem Anzeigen wieder ? Wenn ja, ist das nicht etwas umständlich ?

Ich weiss nicht was da in der Form drin steht.
Aber in dem du die Form schließt löschst du doch quasi auch alles oder?

Blick nicht so recht da durch was du auf die Form setzen willst zu Laufzeit.
Wenn es gedruckte Texte sind reicht ein einfaches refresh bei Hide oder?
Dafür muss ich die Form nicht immer und immer wieder neuladen.

Wenn du das TAdvEdit aufsetzt brauchst du bei hide doch nur die einträge löschen.
Ohne die Komponente immer wieder neu zu laden.

gruss

Uwe Raabe 8. Feb 2012 07:57

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Zitat von RWarnecke (Beitrag 1149778)
Wenn ich aber nur Hide und Show/ShowModal benutze, habe ich ja immer noch die ganzen Eingaben in der Form stehen. Das heißt also, Du löscht dann prinzpell alles beim Verstecken oder vor dem Anzeigen wieder ? Wenn ja, ist das nicht etwas umständlich ?

Sehe ich das richtig, daß du bei jedem Doppelclick in den ListView eine neue Instanz für BillingDetails erstellst? Dann stellt sich die Frage, an welcher Stelle eine etwaige vorherige Instanz freigegeben wird. Wenn du keine besonderen Vorkehrungen getroffen hast, wird das Form bei einem Close eigentlich auch nur versteckt und nicht freigegeben. Wenn du dann beim nächsten Doppelclick eine neue Instanz erzeugst und BillingDetails zuweist, bleibt das vorherige Form noch existent und wird erst bei Freigabe des MainsForms aus dem Speicher entfernt.

RWarnecke 8. Feb 2012 08:06

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1149802)
Sehe ich das richtig, daß du bei jedem Doppelclick in den ListView eine neue Instanz für BillingDetails erstellst?

Ja, das mache ich.
Zitat:

Zitat von Uwe Raabe (Beitrag 1149802)
Wenn du keine besonderen Vorkehrungen getroffen hast, wird das Form bei einem Close eigentlich auch nur versteckt und nicht freigegeben.

Ich habe aber immer gedacht, dass bei einem Close die Form geschlossen wird und auch alles frei gegeben wird. So lernt man nie aus. :gruebel:

Die Form schliesse ich über einen Button so :
Delphi-Quellcode:
  // To close and destroy the form with all data in the memory
  BillingDetails.Close;
  BillingDetails.Release;
Und im Ergenbis OnClose der Form steht noch
Delphi-Quellcode:
Action := caFree
drin. Damit sollte ich doch alles von der Form schliessen und auch wieder freigeben oder habe ich etwas vergessen ?

Uwe Raabe 8. Feb 2012 08:29

AW: TForm mit BorderStyle=bsNone Frage
 
Zitat:

Zitat von RWarnecke (Beitrag 1149804)
Die Form schliesse ich über einen Button so :
Delphi-Quellcode:
  // To close and destroy the form with all data in the memory
  BillingDetails.Close;
  BillingDetails.Release;
Und im Ergenbis OnClose der Form steht noch
Delphi-Quellcode:
Action := caFree
drin. Damit sollte ich doch alles von der Form schliessen und auch wieder freigeben oder habe ich etwas vergessen ?

In dem Fall ist das völlig korrekt, wobei das nach dem Close folgende Release dann überflüssig ist.

Andererseits, was spricht gegen das Beibehalten der Instanz? Du musst doch auch bei einer neuen Form-Instanz die Daten füllen. Bei einer bestehenden würden die vorigen Daten damit doch auch überschrieben.

Ehrlich gesagt, bin ich auch immer noch nicht sicher, daß ich das Problem richtig erfasst habe.

Sir Rufo 8. Feb 2012 08:48

AW: TForm mit BorderStyle=bsNone Frage
 
Bei der Vorgehensweise würde ich aber dringend dazu raten
Delphi-Quellcode:
// To close and destroy the form with all data in the memory
BillingDetails.Close;
BillingDetails := nil;
EDIT:
Denn jetzt kann man ganz leicht abfragen, ob diese Form noch existiert
Delphi-Quellcode:
if Assigned( BillingDetails ) then
 ...

RWarnecke 8. Feb 2012 14:34

AW: TForm mit BorderStyle=bsNone Frage
 
Hallo Sir Rufo,

danke für Deine Antwort. Das war es genau, wonach ich gesucht habe. Jetzt funktoniert alles so wie ich es will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 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