![]() |
Self welche Unit ?
ich will in einer Unit eine Form modal öffnen(ontopstyle)
mein Units Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, ComCtrls, StdCtrls, Vari_Unit, Ini_Unit; ich dachte self ist in Classes aber ne, ich bekomme "self ist nicht definiert" |
Re: Self welche Unit ?
Moin Homer,
self beschreibt immer das Objekt in dessen Methode Du Dich gerade befindest. Ausserhalb einer Methode gibt es das nicht.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin self.Caption := 'Hallo'; // Self ist hier gleich dem Inhalt von Form1 end; |
Re: Self welche Unit ?
nein ich habe es nicht in form
ich hab eine eigne unit //Wenn Fenster noch nicht onShow ist if (ProgressBar_Form.Showing = False) then begin ProgressBar_Form := TProgressBar_Form.Create(self); try ProgressBar_Form.ShowModal; finally ProgressBar_Form.Free; end; end; |
Re: Self welche Unit ?
Moin Homer,
Das Formular war nur ein Beispiel. Anderes Beispiel:
Delphi-Quellcode:
type
TMyClass = class(TObject) private FList : TStringList; public constructor Create(const AsValue : string); destructor Destroy; override; procedure Add(const AsValue : string); end; implementation constructor TMyClass.Create(const AsValue : string); begin inherited Create; FList := TStringList.Create; self.Add(AsValue); // Self ist gleich der Variablen, die die Instanz der Klasse TMyClass enthält end; destructor TMyClass.Destroy; begin FreeAndNil(FList); inherited; end; procedure TMyClass.Add(const AsValue : string); begin FList.Add(AsValue); end; |
Re: Self welche Unit ?
ich brauch das alles?
man man jetzt hast du es aber mit mir wenn ich es für eine form haben will mus ich nur das mit den string gegen tForm tauschen ? ich will eigentlich nur ein fenster modal öffnen und das aus einer anderen unit |
Re: Self welche Unit ?
Moin Homer,
ich wollte Dir nur mal ein anderes Beispiel dafür zeigen, wo es self gibt. Self gibt es ausschliesslich innerhalb einer Methode, also der Prozedur oder Funktion einer Klasse. Ansonsten musst Du ersatzweise den Namen der Variablen angeben, die das gewünschte Objekt enthält. [EDIT] Ausserdem: Wenn Du das Formular anschliessend gleich wieder freigibst, brauchst Du auch keinen Owner anzugeben, dann reicht nil. [/EDIT] |
Re: Self welche Unit ?
also hier dann tForm ?
|
Re: Self welche Unit ?
Moin Homer,
TForm wäre der Klassenname. Du bräuchtest aber ein Objekt. |
Re: Self welche Unit ?
Danke
Code:
if (ProgressBar_Form.Showing = False) then
begin ProgressBar_Form := TProgressBar_Form.Create([color=red]ProgressBar_Form[/color]); try ProgressBar_Form.ShowModal; finally ProgressBar_Form.Free; end; end; |
Re: Self welche Unit ?
Meinte ich doch :oops:
|
Re: Self welche Unit ?
Moin Homer,
ein Objekt kann nicht sein eigener Owner sein. Das geht so also nicht. Wie gesagt, wenn Du sicherstellst, dass das Fenster wieder freigegeben wird, trag einfach nil ein. Den Owner brauchst Du nur, wenn Du Delphi dazu veranlassen willst ein Objekt automatisch zerstören zu lassen, wenn dessen Owner zerstört wird. |
Re: Self welche Unit ?
doch so geht es aber
nur mit den Showing leider nicht da bekomme ich ein Fehler ohne prüfung auf show geht es aber du hast recht das freigeben hab ich vergessen |
Re: Self welche Unit ?
Moin Homer,
das Freigeben hast Du nicht vergessen. Du hast ja
Delphi-Quellcode:
geschrieben.
ProgressBar_Form.Free
Das Showing muss schiefgehen, weil das Objekt zu dem Zeitpunkt noch gar nicht existiert. Und da Du das sichergestellt hast, mit dem try/finally Block, brauchst Du das auch nicht abzufragen. |
Re: Self welche Unit ?
leider bekomme ich eine fehler
weil die showing for der try ist |
Re: Self welche Unit ?
Du könntest in der Unit eine Status-Variable anlegen, deren Wert du selber änderst, etwa so:
Delphi-Quellcode:
var
PBFShowing : bool = false;
Delphi-Quellcode:
if (PBFShowing = False) then
begin PBFShowing := true; ProgressBar_Form := TProgressBar_Form.Create(nil); try ProgressBar_Form.ShowModal; finally ProgressBar_Form.Free; PBFShowing := false; end; end; |
Re: Self welche Unit ?
Moin Homer,
warum nicht so?
Delphi-Quellcode:
Wobei Du Dir eigentlich auch die Abfrage auf nil sparen kannst, da Du das Formular Modal anzeigen lässt, und es danach garantiert wieder freigibst, womit sichergestellt ist, dass es beim nächsten Aufruf der Routine nicht existiert.
if ProgressBar_Form = nil then begin
// Wird gleich wieder freigegeben, dann kann der Owner nil sein. ProgressBar_Form := TProgressBar_Form.Create(nil); try ProgressBar_Form.ShowModal; finally FreeAndNil(ProgressBar_Form); end; end; |
Re: Self welche Unit ?
hi christian
ich erklär mal was ich eigentlich machen will ich mit der form meine ProgressBar(dieDicke) starten und das Modal. dadurch wird ja nur das fenster aktiv und man kann nix anderes anklicken, denn solange ich ich was mache oder mein programm soll man nix klicken, sonst gib es ungewollte effekte. nur wenn ich das fenster öffne bleib leider mein code stehen ich hab ne unit in der ich die ganzen parameter wie start, end und postion der gauge übergebe, auch das modal öffnen des fensters, die function rufe ich dann auf wenn ich sie brauche unf zum schluss der routine soll das fenster wieder geschlossen werden. |
Re: Self welche Unit ?
Moin Homer,
dazu könntest Du ein ShowModal faken.
Delphi-Quellcode:
Der Code in Unit1 läuft, die Progressbar in Form2 läuft, und Form1 ist nicht anwählbar.
uses unit2;
{$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var frmPB : TForm2; begin frmPB := TForm2.Create(nil); try self.Enabled := false; frmPB.Show; while frmPB.Visible do begin sleep(100); frmPB.ProgressBar1.StepIt; if frmPB.ProgressBar1.Position >= frmPB.ProgressBar1.Max then frmPB.Close; Application.ProcessMessages; end; finally FreeAndNil(frmPB); self.Enabled := true; end; end; |
Re: Self welche Unit ?
danke
werde es gleich mal testen |
Re: Self welche Unit ?
mist
das gleich was wir schon mal hatten er kenn self nicht |
Re: Self welche Unit ?
das mit den self hab ich geändert - hab den namen der form genommen
nur ist die erste form immer noch anwählbar ps mal soll auch nicht imer nur code abschreiben - mist nicht show sondern showmodal - ich dummerchen |
Re: Self welche Unit ?
Moin Homer,
doch Show. Das ist ja gerade der Witz an der Sache, dass sich das erste Formular verhält, als würde aus diesen heraus das zweite per ShowModal geöffnet, ohne dass dieses der Fall ist. Wenn er self nicht kennt, hast Du es nicht innerhalb einer Methode verwendet. Nur dort gibt es self. Lies Dir diesen Thread mal in Ruhe durch. Vielleicht wird es dann klarer: ![]() |
Re: Self welche Unit ?
nein kein erfolg
wenn ich es of show stelle kann man die andere forn nch anklicken bei modal dann nicht mehr ABER er flacktert wie verrückt (sleep) er zeigt nix an nur die form so sieht jetzt meine Procedure aus
Code:
bei modal nehme ich das fenster bei option bei automatisch raus - dann kommt aber fehler
//******************************************************************************
//Global //ProgressBar starten Procedure ProgressBar_GU(meldung1_s, meldung2_s, icon_s : String; start_i, end_i, ist_i : Integer); var pb_f : TProgressBar_Form; begin pb_f := TProgressBar_Form.Create(nil); try ProgressBar_Form.Enabled := False; pb_f.ShowModal; /////////////////////////////////////oder show while pb_f.Visible do begin //sleep(200); //Wenn ProgressBar nicht Sichbar dann initialisieren if (ProgressBar_Form.Panel1.Visible = False) then begin ProgressBar_Form.Label1.Caption := ''; ProgressBar_Form.Label2.Caption := ''; ProgressBar_Form.Image1.Picture := NIL; ProgressBar_Form.Panel1.Visible := True; end; //Nur wenn Label noch leer, dann erst füllen if ((ProgressBar_Form.Label1.Caption = '') AND (ProgressBar_Form.Label2.Caption = '')) then begin ProgressBar_Form.Label1.Caption := Meldung_Lesen_GU(meldung1_s); ProgressBar_Form.Label2.Caption := Meldung_Lesen_GU(meldung2_s); end; //Nur wenn Image noch leer, dann erst füllen if (ProgressBar_Form.Image1.Picture.Icon.Empty = True) then begin ProgressBar_Form.Image1.Picture.Icon := Icon_Lesen_GU(icon_s); end; //ProgressBar initialiesieren ProgressBar_Form.ProgressBar.MinValue := start_i; ProgressBar_Form.ProgressBar.MaxValue := end_i; //ProgressBar hochzählen ProgressBar_Form.ProgressBar.Progress := ist_i; if (end_i >= ist_i) then begin pb_f.Close; end; Application.ProcessMessages; end; finally FreeAndNil(pb_f); ProgressBar_Form.Enabled := True; end; end; |
Re: Self welche Unit ?
Moin Homer,
ich hab' mal Deine Doppelposts gelöscht ;-) Wenn Du mal die Prozedur Procedure ProgressBar_GU so einbauen würdest
Delphi-Quellcode:
dann könntest Du auch self benutzen.
type
TForm1 = class(TForm) // Ich weiss nicht, wie Dein Hauptformular heisst Procedure ProgressBar_GU(....); //... implementation //... Procedure TForm1.ProgressBar_GU(.....); begin end; Das Beispiel von mir funzt eigentlich einwandfrei. Mir ist jetzt nicht ganz klar wieso das bei Dir nicht geht. Vielleicht könntest Du mal den kompletten Source hier ranhängen, denn ich komm' auch ein wenig mit Deinen Benennungen ins Schleudern. Wenn pb_f von Typ TProgressBar_Form ist, was ist dann Progressbar_form??? |
Re: Self welche Unit ?
Zitat:
Zitat:
ich glaub es ist zu spät - sitze schon zulange - werde das tun was ich gleich tun sollte - schlafen, nahrung, frau glücklich machen, deine post's in ruhe lesen, darüber nachdenken und versuchen sie zu verstehen - dann selber denken und erst dann wieder eine frage zu stellen |
Re: Self welche Unit ?
Delphi-Quellcode:
Gruß Hagen
TProgressBar_Form.Create(Application);
|
Re: Self welche Unit ?
moin christian
hab dir den file als pm geschickt ich hoffe du kannst es jetzt besser verstehen - du ? kann ich es verstehen ? :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 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