![]() |
Re: dynamischer Speicher füllen
Komme leider immer noch nicht viel weiter! Gebe mal die Kompletten funktionen frei, vielleicht könnt ihr mir dann vielleicht doch noch besser Hilfe geben! Habe es mal versucht, wie Marabu es mir beschrieben hat, aber leider ohne Erfolg! Also der Speicher wird ja durch AllocMem reserviert, und mit nullen gefüllt! Aber anscheinend habe ich nur den Speicher in der Größe von 3 * 256 Bytes = 768 Bytes reserviert! Wie bekomme ich jetzt aus dem Allocierten Speicher ein beschreibbares und auslesbares array gestrickt?
Dies ist die Procedure die genutzt wird um den Speicher zu reservieren!
Delphi-Quellcode:
Get_palette habe ich neu geschrieben, um die Farbtabelle aus einer ini Datei auszulesen, um Sie dann in das dynamische Array hineinzuschreiben! Kann hier aber nur auf die erste Ebene zugreifen!
procedure TPCX.GetMemory;
var i,l : integer; MemSize : integer; p: PRGB_TYPE; begin for i := 0 to PXD_Descriptor.NumPictures-1 do begin MemSize := SizeOf(TPcx_Data) * PXD_Descriptor.NumData[i]; PXD_Descriptor.DataPtr[i] := AllocMem(MemSize); end; for i := 0 to PXD_Descriptor.NumPictures -1 do begin if PXD_Descriptor.AnzColors[i] >= 0 then begin MemSize := SizeOf(TRGB_TYPE) * PXD_Descriptor.AnzColors[i]; p:= AllocMem(MemSize*2); PXD_Descriptor.Palette[i] := p; for l := 0 to 255 do begin get_palette(i,l); Inc(p); end; end; end; end; @Franktron Dein Vorschlag mit dem festen array ist gar nicht mal so schlecht! Will aber noch nicht zu dieser Lösung tendieren, da ich es lieber dynamisch haette! Da wir bei unserem alten Regler auch noch mit 16 Farben Bildern arbeiten! Würde aber auch gehen, da ich die ersten 16 Farben eh identisch gehalten habe!
Delphi-Quellcode:
Vielleicht kann mir ja doch jemand den entscheidenden Hinweis geben! Man kann mir das vielleicht an der Hand eines kleines Beispeils verdeutlichen wo mein Denkfehler ist!
//////////////////////////neu Palette einlesen aus der .ini datei///////////
procedure TPCX.get_palette(i,l: integer); var ini: TiniFile; test: string; k: integer; testcolor: TColor; rgbtest: Byte; PRGB: PRGB_TYPE; 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(l),''); 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; :wall: Danke!!! |
Re: dynamischer Speicher füllen
Dann machs so
Delphi-Quellcode:
Palette : array[0..MAX_PIC-1] of Array of PRGB_TYPE;
und dann mit Setlength(Palette[i],AnzFarben) die grösse setzen |
Re: dynamischer Speicher füllen
Hallo porter10,
ich nehme an, dass an deinem Code nicht viel geändert werden darf, also habe ich mich darauf beschränkt die Mängel zu beheben, die ich erkennen konnte. Vielleicht schaut ja noch jemand drüber. Getestet habe ich nicht. Wenn dir etwas spanisch vorkommt können wir drüber reden.
Delphi-Quellcode:
Grüße vom marabu
procedure TPCX.GetMemory;
var i, l: integer; memSize: integer; p: PRGB_TYPE; ini: TiniFile; begin ini := TIniFile.Create(mainform.configpath + '\Einstellungen.ini'); for i := 0 to PXD_Descriptor.NumPictures - 1 do begin memSize := SizeOf(TPcx_Data) * PXD_Descriptor.NumData[i]; PXD_Descriptor.DataPtr[i] := AllocMem(MemSize); if PXD_Descriptor.AnzColors[i] >= 0 then begin MemSize := SizeOf(TRGB_TYPE) * PXD_Descriptor.AnzColors[i]; p := AllocMem(MemSize); PXD_Descriptor.Palette[i] := p; for l := 0 to PXD_Descriptor.AnzColors[i] - 1 do begin get_palette(ini, p, l); Inc(p); end; end; end; Ini.Free; end; procedure TPCX.get_palette(ini: TIniFile; p: PRGB_TYPE; l: integer); var test: string; testcolor: TColor; begin ReglerRGB := ini.Readstring('ReglerAuswahl', '1', ''); // global var? ReglerReso := ini.Readstring('ReglerAuswahl', '2', ''); // global var? test := ini.Readstring(ReglerRGB, inttostr(l), ''); testcolor := stringtoColor(test); p^.rgbBlue := colortorgb(testcolor); p^.rgbGreen := colortorgb(testcolor); p^.rgbRed := colortorgb(testcolor); end; |
Re: dynamischer Speicher füllen
@Marabu
Danke vielen Dank! Hast mir sehr geholfen, war ein guter denk anstoss! Habe also das Problem gelöst, und schon baut sich ein neues auf! Weist du vielleicht noch eine gute Methode um Hexadezimale Farbwerte in rot gruen und blau anteil aufzuteilen! Wie du ja bereits gesehen hast, hatte ich das versucht mit ColortoRGB, aber das liefert mir ja nur einen longint windowsrgb wert wieder, so wie ich das verstanden habe! :wall: Wie könnte ich vorgehen, wenn ich $800080 in 128-0-128 haben wollte! Wollte andere Helfer nicht verprellen, nur weil ich jetzt direkt an Marabu geschrieben habe das Problem! Wenn wer anderes auch einen Rat fuer mich hat, bin ich sehr dankbar! :coder2: |
Re: dynamischer Speicher füllen
Hilft dir das weiter?
Delphi-Quellcode:
Du müsstest dir nur noch Gedanken über die Absicherung deines Codes machen. Was soll passieren, wenn unsinnige Werte in der Steuerdatei stehen?
function SetRGB(var RGB: TRGB_TYPE; colorString: string): boolean;
var c: TColor; a: array [1..3] of byte absolute c; begin c := StringToColor(colorString); rgb.rgbRed := a[1]; rgb.rgbGreen := a[2]; rgb.rgbBlue := a[3]; end; procedure TPCX.get_palette(ini: TIniFile; p: PRGB_TYPE; l: integer); var test: string; begin ReglerRGB := ini.Readstring('ReglerAuswahl', '1', ''); // global var? ReglerReso := ini.Readstring('ReglerAuswahl', '2', ''); // global var? test := ini.Readstring(ReglerRGB, inttostr(l), ''); SetRGB(p^, test); end; Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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