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/)
-   -   tImage1 geht nur im Form1.OnCreate (https://www.delphipraxis.net/183633-timage1-geht-nur-im-form1-oncreate.html)

ReVenGer 24. Jan 2015 13:00

tImage1 geht nur im Form1.OnCreate
 
Hi,
habe ein wahrscheinlich sehr triviales Problem mit einem Timage.
Wenn ich die gesamte Prozedur ins Form.Create schreibe funktioniert alles ohne Probleme.

Als extra Prozedur sagt Delphi mir "Image1 undeklarierter Bezeichner".

1. funktioniert
Code:


procedure TForm1.FormCreate(Sender: TObject);
var fAppPath: String;
begin
  fAppPath := ExtractFilePath(Application.Exename);
  UrlDownloadToFile(nil,
    Pwidechar(
    'http://myurl.com/banner.png'),
    Pwidechar(fAppPath + 'banner.png'), 0, nil);
  Image1.Picture.LoadFromFile(fAppPath + 'banner.png');
end;

2.funktioniert so nicht, warum?
Code:
 


procedure getbanner;
var fAppPath: String;
begin
  fAppPath := ExtractFilePath(Application.Exename);
  UrlDownloadToFile(nil,
    Pwidechar(
    'http://myurl.com/banner.png'),
    Pwidechar(fAppPath + 'banner.png'), 0, nil);
  Image1.Picture.LoadFromFile(fAppPath + 'banner.png');
end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
getbanner;
end;

Klaus01 24. Jan 2015 13:42

AW: tImage1 geht nur im Form1.OnCreate
 
Hallo,

du musst aus der Procedure getBanner eine Methode der Klasse TForm machen.
GetBanner kennt nicht die Komponenten der TForm Klasse.

Grüße
Klaus

dataspider 24. Jan 2015 15:31

AW: tImage1 geht nur im Form1.OnCreate
 
Oder du übergibst der procedure Image1 als Parameter:

Delphi-Quellcode:
procedure GetBanner(AImage: TImage);
var
  fAppPath: String;
begin
  fAppPath := ExtractFilePath(Application.Exename);
  UrlDownloadToFile(nil,
      Pwidechar(
      'http://myurl.com/banner.png'),
      Pwidechar(fAppPath + 'banner.png'), 0, nil);
  AImage.Picture.LoadFromFile(fAppPath + 'banner.png');
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
  GetBanner(Image1);
end;
Frank

ReVenGer 24. Jan 2015 15:51

AW: tImage1 geht nur im Form1.OnCreate
 
@Klaus, wie mache ich aus getBanner eine Methode der Klasse TForm?

@Frank, vielen Dank für das Beispiel, aber wie verhält es sich wenn ich mehrere Komponenten mit einbinden möchte (z.B. progressbar, button usw.)
müssen die parameter dann alle einzeln zugewiesen werden?

Alles etwas anders als ich von Pascal gewohnt war.

DeddyH 24. Jan 2015 16:30

AW: tImage1 geht nur im Form1.OnCreate
 
Delphi-Quellcode:
type
  TDeinForm = class(TForm)
  private
    (* Deklaration einer Methode der Klasse TDeinForm *)
    procedure GetBanner(AImage: TImage);
    ...
  end;

...

(* Implementation der Methode *)
procedure TDeinForm.GetBanner(AImage: TImage);
begin
  (* Code *)
end;

ReVenGer 24. Jan 2015 17:55

AW: tImage1 geht nur im Form1.OnCreate
 
Jetzt verstehe ich das auch. Vielen Dank!

Helmi 24. Jan 2015 17:59

AW: tImage1 geht nur im Form1.OnCreate
 
wobei diese Möglichkeit auch noch besteht, wenn die Procedure eine Methode von Form1 ist:

Delphi-Quellcode:
type
   TDeinForm = class(TForm)
   private
     (* Deklaration einer Methode der Klasse TDeinForm *)
     procedure GetBanner;
     ...
   end;

 ...

(* Implementation der Methode *)
procedure TDeinForm.GetBanner;
var
  fAppPath: String;

begin
  fAppPath := ExtractFilePath(Application.Exename);
  UrlDownloadToFile(nil, Pwidechar('http://myurl.com/banner.png'), Pwidechar(fAppPath + 'banner.png'), 0, nil);
  Image1.Picture.LoadFromFile(fAppPath + 'banner.png');
end;

himitsu 24. Jan 2015 18:23

AW: tImage1 geht nur im Form1.OnCreate
 
Zitat:

Zitat von Helmi (Beitrag 1287653)
wobei diese Möglichkeit auch noch besteht, wenn die Procedure eine Methode von Form1 ist:

Siehe Antwort #2, aber so zumindestens als Beispiel.

Zitat:

PWiceChar
Bitte kein WideChar bei einer dynamischen Funktion oder einem dynamischen Typen :!:

UrlDownloadToFile -> PChar
UrlDownloadToFileA -> PAnsiChar
UrlDownloadToFileW -> PWideChar

String -> PChar
AnsiString -> PAnsiChar
WideString und UnicodeString -> PWideChar

dataspider 24. Jan 2015 18:30

AW: tImage1 geht nur im Form1.OnCreate
 
Zitat:

Zitat von ReVenGer (Beitrag 1287639)
@Frank, vielen Dank für das Beispiel, aber wie verhält es sich wenn ich mehrere Komponenten mit einbinden möchte (z.B. progressbar, button usw.)
müssen die parameter dann alle einzeln zugewiesen werden?

Also, wenn es darum geht, mehrere Controls im Form zu initialisieren oder was auch immer, dann ist die Methode von Klaus natürlich eher geeignet.
Also als Methode der Form und nicht als Procedure.
Dann brauchst du auch keine Parameter, da du auf alle Eigenschaften des Form Zugriff hast.

Frank

ReVenGer 24. Jan 2015 19:22

AW: tImage1 geht nur im Form1.OnCreate
 
Danke erstmal an alle die sich hier so positiv mit meinem Problem befassen!

@himitsu: dachte mit PWideChar bin ich immer sicher was den Namen betrifft.

Wenn ich das ganze mit inifiles probiere, sagt er mir das Tinifiles nicht deklariert ist.

Code:
private
    { Private-Deklarationen }
    procedure getbanner;
    procedure readini;


procedure TForm1.readini;
var ini: Tinifiles;
begin
  Ini := TIniFile.Create('C:my.ini');
  try
    Edit1.Text := Ini.ReadString('Directory', 'MyCfg','1 ');
  finally
    Ini.Free;
  end;
end;
GetBanner funktioniert perfekt und ich dachte ich hätte es damit auch verstanden.

Helmi 24. Jan 2015 19:27

AW: tImage1 geht nur im Form1.OnCreate
 
du musst die Unit "IniFiles" unter
Delphi-Quellcode:
uses
aufnehmen

ReVenGer 24. Jan 2015 19:33

AW: tImage1 geht nur im Form1.OnCreate
 
Die befindet sich dort. Das ist ja das was ich nicht verstehe.

Helmi 24. Jan 2015 19:37

AW: tImage1 geht nur im Form1.OnCreate
 
es muss ja auch TIniFile statt TIniFiles lauten

Delphi-Quellcode:
procedure TForm1.readini;
 var ini: Tinifile; //<== ohne s
 begin
   Ini := TIniFile.Create('C:my.ini'); //<== sicher dass der Pfad stimmt??
   try
     Edit1.Text := Ini.ReadString('Directory', 'MyCfg','1 ');
   finally
     Ini.Free;
   end;
 end;

ReVenGer 24. Jan 2015 19:39

AW: tImage1 geht nur im Form1.OnCreate
 
Zitat:

es muss ja auch TIniFile statt TIniFiles lauten
Ok, das is jetzt peinlich! :oops:

Der Pfad war nur auf die schnelle, und "auf die schnelle" hab ich mich auch mit Tinifile's' vertippt.

Vielen Dank!

borstenei 24. Jan 2015 19:44

AW: tImage1 geht nur im Form1.OnCreate
 
....wobei das nicht üblich ist , die ini direkt unter C: abzulegen...ermittle doch Dein Programmverzeichnis und packt das Teil da rein.

DeddyH 24. Jan 2015 20:24

AW: tImage1 geht nur im Form1.OnCreate
 
Wäre AppData nicht besser, das ist ja schließlich für Programmdaten vorgesehen?

borstenei 24. Jan 2015 20:30

AW: tImage1 geht nur im Form1.OnCreate
 
Jo..alles nur nicht C:
..oder gleich auf den Ini-Kram verzichten und in die Registry schreiben

ReVenGer 24. Jan 2015 20:36

AW: tImage1 geht nur im Form1.OnCreate
 
Ja, Appdata wäre auch meine Wahl gewesen. Wenn jemand von sich selber behauptet das er (meinereiner) maximal nur 2% von Delphi versteht, sollte dieser meiner Meinung nach lieber die Finger von der Registry lassen, sonst kann man gleich die Windows Installations CDs dem Programm mitgeben.

himitsu 24. Jan 2015 20:40

AW: tImage1 geht nur im Form1.OnCreate
 
Zitat:

TIniFiles
:zwinker:

Und nein.
Es gibt Funktionen und Typen, die sind Ansi, andere sind Unicode und Andere passen sich z.B. an den Compiler an.
PChar, String, Char, Integer/Cardinal (früher) und NativeInt/NativeUint (seit Win64) passen sich an den Compiler an, da es keine eigenen Typen sind, sondern Alias.
Vor Delphi 2009 waren sie ein Alias für die PAnsiChar, AnsiChar und AnsiString und seit D2009 sind sie Alias für PWideChar, WideChar und UnicodeString, bzw. in einem 32-Bit-Compier ein Alias für LongInt/LongWord und in einem 64-Bit-Compiler für LargeWord und LargeInt.

Aber vorallem bei Pointern, also PChar/PWideChar/PAnsiChar muß man genau auf den Typen achten, da es dort intern keine automatische Typ-Umwandlubng gibt und oftmals auch nicht geben kann.


[edit]
Ups, die böse Seite 2 :oops:

borstenei 24. Jan 2015 20:44

AW: tImage1 geht nur im Form1.OnCreate
 
ja sicher ist sicher !... aber schau Dir die Möglichkeiten der Speicherung in der Registry mal an, das ist ähnlich der Ini-Files....und der Schaden für falsche Einträge hält sich in Grenzen..:-D


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