Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Klassen (https://www.delphipraxis.net/76158-problem-mit-klassen.html)

Khabarakh 30. Aug 2006 22:14

Re: Problem mit Klassen
 
Zitat:

Zitat von 3_of_8
Wieder was dazugelernt. An dieser Stelle könnte man doch eigentlich doch eigentlich Delphi wieder ein bisschen "sicherer" machen, indem man da eine AV raist, oder?

Dann müsstest du erstmal Free neu implementieren ;) .

3_of_8 30. Aug 2006 22:23

Re: Problem mit Klassen
 
Dafür könnte man ja dann ne Extra-Direktive einführen. :D

Cöster 31. Aug 2006 15:52

Re: Problem mit Klassen
 
Zitat:

Zitat von mkinzler
Zitat:

Danke für den Hinweis. Was schlägst du mir denn vor, wie ich das überarbeiten sollte?
Alle Referenzen auf Form1 entfernen, und diese als parameter der Methode übergeben.

Meinst du so?
Delphi-Quellcode:
procedure TBild.Oeffnen(Dlg: TOpenPictureDialog; Img: TImage);
begin
  If Dlg.Execute then
  begin
    self.FCurrentFile := Dlg.FileName;
    Img.Picture.LoadFromFile(Dlg.FileName);
    Img.Picture.Bitmap.PixelFormat := pf24Bit;
    Img.Visible := True;
  end;
end;

mkinzler 31. Aug 2006 15:58

Re: Problem mit Klassen
 
Ja. Nur hier würde ich auch gleich den Dateiname übergeben:
Delphi-Quellcode:
TBild.Oeffnen(FileName: String; Img: TImage);
...
self.FCurrentFile := FileName;

Cöster 31. Aug 2006 16:04

Re: Problem mit Klassen
 
Zitat:

Zitat von mkinzler
Ja. Nur hier würde ich auch gleich den Dateiname übergeben:
Delphi-Quellcode:
TBild.Oeffnen(FileName: String; Img: TImage);
...
self.FCurrentFile := FileName;

Dann bräuchte ich aber drei Parameter. Für Dlg.Execute brauche ja auch den Parameter des Typs TOpenPictureDialog. Hast du das übersehen?

mkinzler 31. Aug 2006 16:09

Re: Problem mit Klassen
 
Zitat:

Dann bräuchte ich aber drei Parameter. Für Dlg.Execute brauche ja auch den Parameter des Typs TOpenPictureDialog. Hast du das übersehen?
Ja, dann war deine Lösung natürlich besser.

Jelly 31. Aug 2006 16:10

Re: Problem mit Klassen
 
Zitat:

Zitat von Cöster
Dann bräuchte ich aber drei Parameter. Für Dlg.Execute brauche ja auch den Parameter des Typs TOpenPictureDialog. Hast du das übersehen?

Klassen sollen, wenn möglich, für sich alleine werkeln können. Referenzen von anderen Objekten zu übergeben ist also nicht immer angebracht, meiner Meinung nach.

Da ich davon ausgehe, dass Du jetzt kein spezielles TOpenPictureDialog konfigueriert hast, würde ich diesen auch selbst in deiner Klasse erzeugen. Dann brauchst Du nämlich gar nix übergeben... Etwa so:


Delphi-Quellcode:
procedure TBild.Oeffnen(Img: TImage);
var
 dlg : TOpenPictureDialog ;
begin
  try
     Dlg := TOpenPictureDialog.create (Self) ;
     // Hier kannst Du natürlich noch weiter Dlg Eigenschaften einstellen, wie z.B. Dlg.Title oder Dlg.Filter
     If Dlg.Execute then
     begin
       self.FCurrentFile := Dlg.FileName;
       Img.Picture.LoadFromFile(Dlg.FileName);
       Img.Picture.Bitmap.PixelFormat := pf24Bit;
       Img.Visible := True;
     end;
  finally
     Dlg.Free ;
  end ;
end;

Cöster 31. Aug 2006 16:26

Re: Problem mit Klassen
 
Zitat:

Zitat von Jelly
Da ich davon ausgehe, dass Du jetzt kein spezielles TOpenPictureDialog konfigueriert hast...

Was heißt speziell?

Zitat:

Zitat von Jelly
Dlg := TOpenPictureDialog.create (Self) ;

Inkompatible Typen: 'TComponent' und 'TBild'

Noch ne Frage: Wozu ist der try-finally-Block erforderlich. Kann es etwa sein, dass er es nicht schafft den Dialog zu createn?

GuenterS 31. Aug 2006 16:28

Re: Problem mit Klassen
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Cöster
Dann bräuchte ich aber drei Parameter. Für Dlg.Execute brauche ja auch den Parameter des Typs TOpenPictureDialog. Hast du das übersehen?

Klassen sollen, wenn möglich, für sich alleine werkeln können. Referenzen von anderen Objekten zu übergeben ist also nicht immer angebracht, meiner Meinung nach.

Da ich davon ausgehe, dass Du jetzt kein spezielles TOpenPictureDialog konfigueriert hast, würde ich diesen auch selbst in deiner Klasse erzeugen. Dann brauchst Du nämlich gar nix übergeben... Etwa so:


Delphi-Quellcode:
procedure TBild.Oeffnen(Img: TImage);
var
 dlg : TOpenPictureDialog ;
begin
  try
     Dlg := TOpenPictureDialog.create (Self) ;
     // Hier kannst Du natürlich noch weiter Dlg Eigenschaften einstellen, wie z.B. Dlg.Title oder Dlg.Filter
     If Dlg.Execute then
     begin
       self.FCurrentFile := Dlg.FileName;
       Img.Picture.LoadFromFile(Dlg.FileName);
       Img.Picture.Bitmap.PixelFormat := pf24Bit;
       Img.Visible := True;
     end;
  finally
     Dlg.Free ;
  end ;
end;


Delphi-Quellcode:
procedure TBild.Oeffnen(Img: TImage);
var
 dlg : TOpenPictureDialog ;
begin
     Dlg := TOpenPictureDialog.create (Self) ;
  try
     // Hier kannst Du natürlich noch weiter Dlg Eigenschaften einstellen, wie z.B. Dlg.Title oder Dlg.Filter
     If Dlg.Execute then
     begin
       self.FCurrentFile := Dlg.FileName;
       Img.Picture.LoadFromFile(Dlg.FileName);
       Img.Picture.Bitmap.PixelFormat := pf24Bit;
       Img.Visible := True;
     end;
  finally
     Dlg.Free ;
  end ;
end;
Wäre so besser, da Du sonst versuchst etwas freizugeben, was vielleicht gar nicht erzeugt worden ist, im Falle wenn das Erzeugen des Dialogs schon fehlschlägt.

Jelly 31. Aug 2006 16:32

Re: Problem mit Klassen
 
Zitat:

Zitat von Cöster
Was heißt speziell?

Damit mein die Eigenschaften die du bei deiner TOpenPictureDialog im Object Inspector eingestellt hast. Die müsstest Du dann im Code setzen.

Zitat:

Zitat von Cöster
Inkompatible Typen: 'TComponent' und 'TBild'

Sorry, mein Fehler... TBild ist ja nicht von TComponent abgeleitet... Probier mal
Delphi-Quellcode:
Dlg := TOpenPictureDialog.create (nil) ;
Zitat:

Zitat von Cöster
Noch ne Frage: Wozu ist der try-finally-Block erforderlich. Kann es etwa sein, dass er es nicht schafft den Dialog zu createn?

Es sollte nicht seil können, aber um sicher zu gehen, werden so Create...Free Konstrukte prinzipiell in einen try...finally Block gepackt... Alles unter finally wird auf jeden Fall ausgeführt, auch wenn ein Fehler auftritt. Ist zwar bei deinem bisherigem Code unwahrscheinlich, aber wenn Du den noch um 300 Zeilen ergänzt eventuell nicht mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr.
Seite 2 von 3     12 3      

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