Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   TPicture-Array per for-to-do-Schleife füllen < zu blöd :( (https://www.delphipraxis.net/155304-tpicture-array-per-do-schleife-fuellen-zu-bloed.html)

Qnkel 17. Okt 2010 23:29


TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Moin.

Programmiere mit Lazarus, habe vorher Delphi genutzt.

Ich habe ein TPicture-Array und will dort Bilder von einem Kartenspiel reinladen. Die sind von 0 bis 31 durchnummeriert.

Mein Code:

Delphi-Quellcode:
var
  Kartenblatt: array[0..31] of TPicture;
 
function Kartenladen(Pfad, Typ: string): Boolean;
var i: integer;
begin
  Result := True;
  for i:=0 to 31 do
    begin
      ShowMessage(Pfad + '\' + IntToStr(i) + '.' + Typ);
      Kartenblatt[i].PNG.Create;
      If FileExists(Pfad + '\' + IntToStr(i) + '.' + Typ) then
        Kartenblatt[i].PNG.LoadFromFile(Pfad + '\' + IntToStr(i) + '.' + Typ)
      Else
        Result := False;
    end;
end;
Wo liegt der Fehler?
Am Anfang hatte ich noch direkt Kartenladen[i].LoadFromFile genutzt ohne die Dateierweiterung vorher anzugeben.
Der Funktion soll ja eig. mit der Variable "Typ" erst der Dateityp übergeben werden, habe gehoffft TPicture erkennt das automatisch.

Aber auch wenn ich direkt mit ".PNG." arbeite und PNG-Dateien liefere, stürzt es mit na Fehlermeldung in der picture.inc ab.

Wo liegt mein Fehler?

omata 17. Okt 2010 23:33

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Zitat:

Zitat von Qnkel (Beitrag 1056256)
...stürzt es mit na Fehlermeldung in der picture.inc ab.

Wie lautet die Fehlermeldung?

Und ein Schluss ins blaue...
Delphi-Quellcode:
var
  Kartenblatt: array[0..31] of TPicture;
 
function Kartenladen(Pfad, Typ: string): Boolean;
var i: integer;
begin
  Result := True;
  for i:=0 to 31 do
    begin
      ShowMessage(Pfad + '\' + IntToStr(i) + '.' + Typ);
      Kartenblatt[i]:=TPicture.Create;
      If FileExists(Pfad + '\' + IntToStr(i) + '.' + Typ) then
        Kartenblatt[i].PNG.LoadFromFile(Pfad + '\' + IntToStr(i) + '.' + Typ)
      Else
        Result := False;
    end;
end;

Luckie 17. Okt 2010 23:35

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Zitat:

Zitat von Qnkel (Beitrag 1056256)
na Fehlermeldung in der picture.inc ab.

Willkommen beim lustigen Fehlermeldung raten. :roll:

Und die wichtigen Informationen fehlen mal wieder: Welche Fehlermeldung? Von was für einem Typ ist Kartenblatt? Was ist oder macht die Eiegenschaft PNG? Was soll das:
Delphi-Quellcode:
Kartenblatt[i].PNG.Create;
eine Objekt erstellt man wie folgt:
Delphi-Quellcode:
Objekt := TObjekt.Create();
.

omata 17. Okt 2010 23:38

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Zitat:

Zitat von Luckie (Beitrag 1056259)
Von was für einem Typ ist Kartenblatt?

Das steht doch in der erste Zeile:
Delphi-Quellcode:
var Kartenblatt: array[0..31] of TPicture;

Luckie 17. Okt 2010 23:41

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Mist. Treten meinen ganzen Beitrag in die Tonne. Das war totaler Müll, was ich da geschrieben habe. Aber ohne Fehlermeldung wird es schwer zu helfen.

Qnkel 17. Okt 2010 23:41

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Vielen Dank omata, dein Schluss ins Blaue war genau richtig.

Schon zu spät für sowas :D Sorry, bin so lange raus und hab jetz wieder angefangen...

Könnt euch wieder hinlegen :)

Luckie 17. Okt 2010 23:48

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Wo hat omata denn ins Blaue geschossen? Er hat mich doch nur auf die Deklaration hingewiesen.

@omata: Jetzt weiß ich was passiert ist: Eine Deklaration fängt bei mir immer Mit T-Irgendwas an. Das zugehörige Objekt oder Variable wird dann genauso genannt, nur ohne das T.

DP-Maintenance 18. Okt 2010 05:49

Dieses Thema wurde am "18. Oct 2010, 06:49 Uhr" von "Matze" aus dem Forum "Object-Pascal / Delphi-Language" in das Forum "Lazarus (IDE)" verschoben.

shmia 18. Okt 2010 10:31

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Wenn da 3 Mal im Sourcecode steht:
Delphi-Quellcode:
Pfad + '\' + IntToStr(i) + '.' + Typ
dann sollte man doch eine Zwischenvariable
Delphi-Quellcode:
var filename:string
benützen,oder?

DeddyH 18. Okt 2010 10:49

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Das sehe ich auch so. Außerdem würde ich String-Parameter wann immer möglich (also wenn sie innerhalb der Routine nicht verändert werden) als const deklarieren.

Sir Rufo 18. Okt 2010 11:39

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Also so
Delphi-Quellcode:
var
  Kartenblatt: array[ 0..31 ] of TPicture;

function Kartenladen( const Pfad, Typ: string ) : Boolean;
var
  i: integer;
  filename : string;
begin
  Result := True;
  for i := 0 to 31 do
    begin
      filename := Format( '%s%d.%s', [ IncludeTrailingPathDelimiter( Pfad ), i, Typ ] );
      ShowMessage( filename );
      Kartenblatt[ i ] := TPicture.Create;
      If FileExists( filename ) then
        Kartenblatt[ i ].PNG.LoadFromFile( filename )
      Else
        Result := False;
    end;
end;
Ein Hinweis zu den Begriffen Path/Pfad und Dir/Verzeichnis
Bei Path/Pfad erwartet man ein Verzeichnis mit abschließendem Trennzeichen
Bei Dir/Verzeichnis aber ohne
Delphi-Referenz durchsuchenExtractFilePath Delphi-Referenz durchsuchenExtractFileDir

idefix2 18. Okt 2010 11:54

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
@ Sir Rufo
Was ich gerne wissen würde: Warum verwendest Du in dem Fall format statt einer einfachen Stringconcatination?
format muss erst den Formatstring interpretieren und dementsprechend den Ergebnisstring erzeugen, ist also quasi eine interpretative und deshalb sicher langsamere Variante als der + Operator. Intern verwendet Format wohl auch etwas wie inttostr und concat.

Natürlich ist es bei der Behandlung eines einzelnen Strings völlig gleichgültig, ich würde nur prinzipiell gerne wissen, warum Du es so machst.

Sir Rufo 18. Okt 2010 13:14

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Weil es so einfacher wartbar wird.

Bei Bedarf kann ich die Parameter mehrfach verwenden, das Format ändern und es bleibt übersichtlich.

Qnkel 30. Okt 2010 08:21

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Vielen Dank Sir Rufo, werde es entsprechend anpassen.

JamesTKirk 30. Okt 2010 13:53

AW: TPicture-Array per for-to-do-Schleife füllen < zu blöd :(
 
Hi!

Noch ein kleiner Tipp zum Erleichtern der Wartbarkeit:

Ersetze in deiner For-Schleife die Grenzen durch
Delphi-Quellcode:
Low(Kartenblatt)
und
Delphi-Quellcode:
High(Kartenblatt)
, also folgendermaßen:

Delphi-Quellcode:
// statt
for i:=0 to 31 do
// schreibst du
for i:=Low(Kartenblatt) to High(Kartenblatt) do
Dann musst du die Schleife nicht anpassen, wenn du mal mehr Karten haben möchtest :D

Gruß,
Sven


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