![]() |
dynamischer Speicher füllen
Hallo erstmal!
Bin neu hier im Forum bei Delphipraxis! Bin vor einiger Zeit gefragt worden, ob ich ein älteres Programm bei uns der Firma übernehmen könnte! Es ist leider in Delphi geschrieben, und da ich fast keine Delphi erfahrung habe, kommt es da natürlich des öfteren zu syntax problemen! Lange Rede kurzer Sinn, ich habe probleme ein farb array (rgb = 3x Bytes) zu füllen! Der Speicher wurde mit allocmem reserviert!
Delphi-Quellcode:
Versuche eine Farbpalette in das Array zu schreiben, aber ich weiss nicht, wie ich die folgenden array punkte anspreche!
procedure TPCX.get_palette(i: integer);
var ini: TiniFile; test: string; k: integer; testcolor: TColor; begin if PXD_Descriptor.palette[i] <> NIL then begin ini:=TIniFile.Create(mainform.configpath+'\Einstellungen.ini'); // .ini wird erstellt ReglerRGB:= ini.Readstring('ReglerAuswahl','1',''); ReglerReso:= ini.Readstring('ReglerAuswahl','2',''); for k:=0 to 255 do begin test:= ini.Readstring(ReglerRGB,inttostr(k),''); testcolor:= stringtoColor(test); PXD_Descriptor.Palette[i].rgbBlue:= colortorgb(testcolor); PXD_Descriptor.Palette[i].rgbGreen:= colortorgb(testcolor); PXD_Descriptor.Palette[i].rgbRed:= colortorgb(testcolor); end; end; Ini.Free; end; Da es ja kein pointer ist kann ich nicht mit inc(Pxd_Descriptor.Palette[i].rgbBlue); eine neue ebene schaffen! Komme mir selber blöde vor, deshalb bitte nicht noch Salz in die Wunde streuen! Bitte! Danke jedem schonmal für die Hilfe! :cheers: |
Re: dynamischer Speicher füllen
Hatse mal die Deklartion von PXD_Descriptor
|
Re: dynamischer Speicher füllen
Delphi-Quellcode:
TPXD_Descriptor = packed record
NumPictures : WORD; NumData : array[0..MAX_PIC-1] of WORD; PicName : array[0..MAX_PIC-1] of array[0..8] of char; TabName : array[0..MAX_PIC-1] of array[0..8] of char; DataPtr : array[0..MAX_PIC-1] of PPCX_DATA; ///////////////ab hier neuer Teil///////////////////////////////////// ReglerType : word; AnzColors : array[0..MAX_PIC-1] of word; Palette : array[0..MAX_PIC-1] of PRGB_TYPE; Komment : array[0..MAX_PIC-1] of array[0..40] of char; dst_name : array[0..MAX_PIC-1] of array[0..8] of char; type_name : array[0..MAX_PIC-1] of array[0..3] of char; PicType : array[0..MAX_PIC-1] of word; end;
Delphi-Quellcode:
Hier sind die Records! Danke aber schonmal fuer die schnelle Antwort!
TRGB_TYPE = packed record
rgbBlue : Byte; rgbGreen : Byte; rgbRed : Byte; end; |
Re: dynamischer Speicher füllen
Ist es das, was du suchst?
Delphi-Quellcode:
Grüße vom marabu
// damit erhöhst du nur den RGB-Wert für Blau:
inc(Pxd_Descriptor.Palette[i].rgbBlue); // so kannst du auf die nächste Palette zugreifen: Inc(i); Pxd_Descriptor.Palette[i].rgbBlue := BlauWert; Pxd_Descriptor.Palette[i].rgbGreen := GruenWert; Pxd_Descriptor.Palette[i].rgbRed := RotWert; // Oder auch so: with Pxd_Descriptor.Palette[i] do begin rgbBlue := BlauWert; rgbGreen := GruenWert; rgbRed := RotWert; end; |
Re: dynamischer Speicher füllen
Du must nur den wert der Constante MAX_PIC erhöhen die gibt nämlich den max wert an
|
Re: dynamischer Speicher füllen
Die Anzahl von Bildern soll und muss so bleiben! Ich möchte eine Farbpalette fuer jedes Bild hinterlegen wo jeweils die Rot Blau und Grün anteile drin stehen! Daher rechne ich die Anzahl der Farben mal 3 Byte, um die Farbanteile da rein zu schreiben! Mit
Delphi-Quellcode:
habe ich es schon versucht! Was aber anscheinend nur bei Pointern funktioniert! Oder es addiert nur eine 1 hinzu! Ich möchte wissen wie ich bei 255 * 3 Byte Speicherreservierung, da rauf zu greife!
inc(Pxd_Descriptor.Palette[i].rgbBlue);
Delphi-Quellcode:
Aber schonmal Danke fuer die Hilfen! Wusste auch nicht genau wie ich das Problem umschreiben soll! Bin Forums neuling! :coder:
MemSize := SizeOf(TRGB_TYPE) * PXD_Descriptor.AnzColors[i];
PXD_Descriptor.Palette[i] := AllocMem(MemSize*2); |
Re: dynamischer Speicher füllen
Erstmal Herzlich Willkommen in der DP (ganz vergessen :oops: )
Du kannst das so machen um deine Farbpalette zu speichern
Delphi-Quellcode:
Palette : array[0..MAX_PIC-1] of Array[0..255] of PRGB_TYPE;
|
Re: dynamischer Speicher füllen
Porter10, du denkst zu sehr in C.
PXD_Descriptor.Palette ist Teil einer Struktur, der ganze packed record TPXD_Descriptor ist ein struct. Wenn du irgendwas dynamisch anlegen willst, dann nur den ganzen Deskriptor.
Delphi-Quellcode:
Grüße vom marabu
var
PXD_Descriptor: TPXD_Descriptor; // statisch PPXD_Descriptor: ^TPXD_Descriptor; begin PPXD_Descriptor := AllocMem(SizeOf(TPXD_Descriptor)); //dynamisch end; |
Re: dynamischer Speicher füllen
Hallo Porter10,
manchmal dauert es etwas länger. Wenn PRGB_TYPE ein Pointer auf TRGB_TYPE ist, dann ist Palette ein Zeigerfeld. Du forderst den gesamten für die Paletten benötigten Speicher mit einem AllocMem() an. Kann man machen, ist auch irgendwo ökonomisch, aber dann musst du trotzdem die einzelnen Pointer initialisieren. Oder du forderst den Speicher für jede Palette einzeln an.
Delphi-Quellcode:
Grüße vom marabuvar i: integer; p: PRGB_TYPE; begin // Einzelanforderung for i := 0 to MAX_PIC - 1 do New(Palette[i]); // Blockanforderung p := AllocMem(...); for i := 0 to MAX_PIC - 1 do begin Palette[i] := p; Inc(p); end; end; |
Re: dynamischer Speicher füllen
@Marabu
Danke fuer deine Antworten! Habe eben echt leider noch recht wenig Delphi Erfahrung! Werde es morgen direkt mal auf der Arbeit ausprobieren! Melde mich dann noch mal ob es geklappt hat oder nicht! Alles Gute! :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 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