Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Self welche Unit ? (https://www.delphipraxis.net/11574-self-welche-unit.html)

HomerGER 9. Nov 2003 23:35


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"

Christian Seehase 9. Nov 2003 23:45

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;

HomerGER 9. Nov 2003 23:47

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;

Christian Seehase 9. Nov 2003 23:52

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;

HomerGER 9. Nov 2003 23:57

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

Christian Seehase 10. Nov 2003 00:00

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]

HomerGER 10. Nov 2003 00:01

Re: Self welche Unit ?
 
also hier dann tForm ?

Christian Seehase 10. Nov 2003 00:02

Re: Self welche Unit ?
 
Moin Homer,

TForm wäre der Klassenname.
Du bräuchtest aber ein Objekt.

HomerGER 10. Nov 2003 00:03

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;

HomerGER 10. Nov 2003 00:04

Re: Self welche Unit ?
 
Meinte ich doch :oops:

Christian Seehase 10. Nov 2003 00:05

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.

HomerGER 10. Nov 2003 00:07

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

Christian Seehase 10. Nov 2003 00:11

Re: Self welche Unit ?
 
Moin Homer,

das Freigeben hast Du nicht vergessen.
Du hast ja

Delphi-Quellcode:
ProgressBar_Form.Free
geschrieben.
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.

HomerGER 10. Nov 2003 00:14

Re: Self welche Unit ?
 
leider bekomme ich eine fehler
weil die showing for der try ist

scp 10. Nov 2003 02:53

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;

Christian Seehase 10. Nov 2003 20:06

Re: Self welche Unit ?
 
Moin Homer,

warum nicht so?

Delphi-Quellcode:
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;
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.

HomerGER 11. Nov 2003 20:19

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.

Christian Seehase 11. Nov 2003 20:34

Re: Self welche Unit ?
 
Moin Homer,

dazu könntest Du ein ShowModal faken.

Delphi-Quellcode:
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;
Der Code in Unit1 läuft, die Progressbar in Form2 läuft, und Form1 ist nicht anwählbar.

HomerGER 11. Nov 2003 21:32

Re: Self welche Unit ?
 
danke
werde es gleich mal testen

HomerGER 11. Nov 2003 22:09

Re: Self welche Unit ?
 
mist
das gleich was wir schon mal hatten er kenn self nicht

HomerGER 11. Nov 2003 22:18

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

Christian Seehase 11. Nov 2003 22:46

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:

prozedur aufruf und sender

HomerGER 11. Nov 2003 22:50

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:
//******************************************************************************
//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;
bei modal nehme ich das fenster bei option bei automatisch raus - dann kommt aber fehler

Christian Seehase 11. Nov 2003 23:01

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:
type
  TForm1 = class(TForm) // Ich weiss nicht, wie Dein Hauptformular heisst
    Procedure ProgressBar_GU(....);
  //...


implementation

//...

Procedure TForm1.ProgressBar_GU(.....);
begin
end;
dann könntest Du auch self benutzen.
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???

HomerGER 11. Nov 2003 23:33

Re: Self welche Unit ?
 
Zitat:

Zitat von Christian Seehase
ich hab' mal Deine Doppelposts gelöscht ;-)

danke

Zitat:

Zitat von Christian Seehase
Wenn pb_f von Typ TProgressBar_Form ist, was ist dann Progressbar_form???

blödsinn !?


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

negaH 11. Nov 2003 23:39

Re: Self welche Unit ?
 
Delphi-Quellcode:
  TProgressBar_Form.Create(Application);
Gruß Hagen

HomerGER 12. Nov 2003 20:25

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 06:04 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