![]() |
problem mit dynamischem array
hallo zusammen,
ich habe ein kleines problem mit einem dynamischen array. ich will ein dyn. array in einer for-schleife mit dem jeweiligen indexwert füllen(array[i]:=i). dies funktioniert für alle werte bis auf den letzten, egal wie lang das array ist. der letzte wert des array steht immer bei 118. wie kommt das?? ich hoffe es kann mir jemand helfen schon mal danke im voraus! |
Re: problem mit dynamischem array
Ich nehme an es liegt daran, dass der Index von 0 bis 117 geht.
|
Re: problem mit dynamischem array
Der Index eines dyn. array beginnt immer bei 0
Delphi-Quellcode:
array[i-1]:=i;
|
Re: problem mit dynamischem array
Herzlich willkommen in der Delphi-PRAXiS, chamop87.
Wie sieht denn deine FOR-Schleife aus?
Delphi-Quellcode:
Freundliche Grüße
uses
Types; var i: Integer; ida: TIntegerDynArray; begin SetLength(ida, 119); for i := Low(ida) to High(ida) do ida[i] := i; end; |
Re: problem mit dynamischem array
Liste der Anhänge anzeigen (Anzahl: 1)
ich habs gleich mal ausprobiert mit dem low-high aber das problem besteht weiterhin (0,1,....10,118).
ich ahb mal die dateien angehängt... ich hoffe das hilft beid er problemlösung |
Re: problem mit dynamischem array
Delphi-Quellcode:
Das versteh ich schon nicht. Was soll die 2. Zeile?
for fa:=low(randoms) to high(randoms) do randoms[fa]:=fa;
randoms[11]:=11; |
Re: problem mit dynamischem array
oh, schuldigung, die zweite zeile war nur zu testzwecken da.
11 ist bei mir der höchste wert des array. eignedlich sollte sie den wert von randoms[11]=118 eben auf 11 setzten, aber selbst das funtioniert nicht, keine ahnung wieso |
Re: problem mit dynamischem array
Hallo,
keine Ahnung, was du dir dabei gedacht hast, aber die Anzahl der Bilder ist wie sie ist - da darfst du nicht einfach eins abziehen:
Delphi-Quellcode:
Freundliche Grüße
procedure TForm1.FormCreate(Sender: TObject);
var fa: Integer; begin Randomize; zaehl := 0; filelistbox1.Directory := 'D:\Eigene Dateien\Eigene Bilder\'; filelistbox1.Mask := '*.bmp;*.jpg;*.jpeg'; SetLength(randoms, filelistbox1.Items.Count {- 1}); bildanzahl := filelistbox1.items.count {- 1}; ca := 0; memo1.lines.add(inttostr(filelistbox1.Items.count)); for fa :=low(randoms) to high(randoms) do randoms[fa] := fa; end; |
Re: problem mit dynamischem array
ich ziehe dort jeweils einen ab, weil das array ja zwangsweise bei null losgeht.
beispiel anzahl der bilder=10 wenn ich dann schreibe setlength(array,10) habe ich elf speicherplatze, ich brauche aber nur zehn. ich habe das problem jetzt umgangen, indem ich einen zusätzlichen letzten speicherplatz erstelle den ich aber nicht verwende. in diesem platz hat dann immer den (für mich immer noch unerklärlcihen) wert 118, den ich dann aber nie verwende. über mich würde trotzdem mal interessieren, wie es zu diesem wert kommt, auch wenn ich das problem jetzt umgehen kann. ich habe das programm wie von meinem vorgänger vorgeschlagen verändert und zudem diese zeilen verändert: [/delphi]randoms[zufall]:=randoms[bildanzahl-1]; und [delphi]if bildanzahl=0 then begin danke nochmal für die tipps |
Re: problem mit dynamischem array
Dadurch verändert sich aber die Anzahl nicht.
|
Re: problem mit dynamischem array
Zitat:
SetLength(randoms, 10) führt zu einem Array mit den Indewerten 0 bis 9 und insgesamt 10 Items. Lies nochmal genau in der Hilfedatei nach. Gute Nacht. |
Re: problem mit dynamischem array
genau das habe ich doch auch gesagt
|
Re: problem mit dynamischem array
Nein du gingst von 11 aus
|
Re: problem mit dynamischem array
Dein Code ist Horror,ich habe ihn in soweit korrigiert ,das er für mich halbwegs einen Sinn
ergeben könnte.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var fa:integer; begin randomize; zaehl:=0; filelistbox1.Directory:='C:\';//Eigene Dateien\Eigene Bilder\'; filelistbox1.Mask:='*.bmp;*.jpg;*.jpeg'; if filelistbox1.Items.Count>1 then begin setlength(randoms,filelistbox1.Items.Count); //Edit bildanzahl:=filelistbox1.items.count; //Edit end; ca:=0; memo1.lines.add(inttostr(filelistbox1.Items.count)); for fa:=low(randoms) to high(randoms) do randoms[fa]:=fa; //randoms[11]:=11; end;//procedure procedure TForm1.Button1Click(Sender: TObject); var dateiname,endung:string; fi,fa,fb,zufall,bildnr:integer; begin //for fa:=0 to filelistbox1.items.count-1 do begin //Edit zufall:=bildanzahl; while zufall>high(randoms) do Zufall:=random(bildanzahl); //Edit //while (zufall>Length(randoms)-1) do exit; bildnr:=randoms[zufall]; //Edit for fa:=0 to filelistbox1.Items.count-1 do begin test:=inttostr(randoms[fa]); memo1.lines.add(inttostr(randoms[fa])+' '+inttostr(bildnr)); end; //Letztes Edit memo1.lines.add(test+' '+inttostr(bildnr)); test:=''; randoms[zufall]:=randoms[bildanzahl-1]; //Edit inc(bildanzahl,-1); if bildanzahl<0 then begin for fb:=0 to filelistbox1.items.count-1 do randoms[fb]:=fb; bildanzahl:=filelistbox1.items.count; end; ////EDIT while (bildnr<0) or (bildnr>filelistbox1.items.count-1) do exit; dateiname:=filelistbox1.items[bildnr]; for fi:=length(dateiname)-3 to length(dateiname) do endung:=endung+dateiname[fi]; endung:=lowercase(endung); jpeganzeigen(dateiname,endung); //inc(zaehl); end;//procedure procedure TForm1.jpeganzeigen(dateiname:TFilename;endung:string); var jpeg: TJPEGImage; begin bmp := TBitmap.Create; //Bitmaps anzeigen if endung='.bmp' then bmp.loadfromfile(dateiname); //Jpegs anzeigen if (endung='.jpg') or (endung='jpeg') then begin jpeg := TJPEGImage.Create; try jpeg.CompressionQuality := 100; {Default Value} jpeg.LoadFromFile(dateiname); bmp.Assign(jpeg); finally jpeg.Free end; end;//if image1.picture.bitmap:=bmp; image1.AutoSize:=true; bmp.free; end;//procedure; |
Re: problem mit dynamischem array
Tipp:
lagere das ganze in eine eigene function oder precdure aus und übergebe die Parameter =mehr Übersicht (wer macht was und was soll dabei herauskommen) |
Re: problem mit dynamischem array
Delphi-Quellcode:
unit jpganzeigen02;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FileCtrl,jpeg, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; FileListBox1: TFileListBox; Image1: TImage; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); public Function getZufall(bildanzahl_:integer):integer; Function debugrandoms(L1_,BildNr_:integer):TStrings; procedure jpeganzeigen(dateiname:TFilename; endung:string); Procedure iniRandoms(L1_:integer); { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var bmp: TBitmap; bildanzahl:integer; randoms:array of integer; TestS:string; Testi:integer; Procedure TForm1.iniRandoms(L1_:integer); Var cnt1:integer; begin for cnt1:=0 to L1_-1 do randoms[cnt1]:=cnt1; bildanzahl:=L1_; end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; with Memo1 do begin Align:=alBottom; Scrollbars:=ssBoth; end; with filelistbox1 do begin Directory:='C:\Windows';//Eigene Dateien\Eigene Bilder\'; Mask:='*.bmp;*.jpg;*.jpeg'; if Items.Count>1 then begin setlength(randoms,Items.Count); //Edit iniRandoms(items.count); end; end; //randoms[11]:=11; end;//procedure Function TForm1.debugrandoms(L1_,BildNr_:integer):TStrings; Var cnt1:integer; begin Result:=TStringlist.Create; Result.add('BildNr: '+inttostr(BildNr_)); //Länge überschritten ? wenn ja dann reduzieren while (L1_>Length(randoms)-1) do L1_:=High(randoms); for cnt1:=0 to L1_-1 do Result.add('Randoms' +inttostr(cnt1)+': '+inttostr(randoms[cnt1])); Result.add('*** end of debug ***'); end; Function TForm1.getZufall(bildanzahl_:integer):integer; begin Result:=Random(bildanzahl_); //Edit; while Result>high(randoms) do Result:=random(bildanzahl_); //Edit end; procedure TForm1.Button1Click(Sender: TObject); var dateiname,endung:string; fi,fa,fb,zufall,bildnr:integer; begin zufall:=GetZufall(bildanzahl); bildnr:=randoms[zufall]; //debug anzeigen memo1.lines.Assign(DebugRandoms(filelistbox1.Items.count-1,bildnr)); dateiname:=filelistbox1.items[bildnr]; endung:=ExtractFileExt(dateiname); jpeganzeigen(dateiname,endung); randoms[zufall]:=randoms[bildanzahl-1]; dec(bildanzahl); if bildanzahl<0 then iniRandoms(filelistbox1.items.count); //inc(zaehl); end;//procedure procedure TForm1.jpeganzeigen(dateiname:TFilename;endung:string); var jpeg: TJPEGImage; begin bmp := TBitmap.Create; //Bitmaps anzeigen if endung='.bmp' then bmp.loadfromfile(dateiname); //Jpegs anzeigen if (endung='.jpg') or (endung='jpeg') then begin jpeg := TJPEGImage.Create; try jpeg.CompressionQuality := 100; {Default Value} jpeg.LoadFromFile(dateiname); bmp.Assign(jpeg); finally jpeg.Free end; end;//if image1.picture.bitmap:=bmp; image1.AutoSize:=true; bmp.free; end;//procedure; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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