Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   dynamischer Speicher füllen (https://www.delphipraxis.net/46103-dynamischer-speicher-fuellen.html)

Porter10 24. Mai 2005 13:54

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:
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;
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!

@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:
//////////////////////////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;
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!
:wall:

Danke!!!

franktron 24. Mai 2005 14:01

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

marabu 24. Mai 2005 21:27

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:
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;
Grüße vom marabu

Porter10 27. Mai 2005 14:06

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:

marabu 27. Mai 2005 14:41

Re: dynamischer Speicher füllen
 
Hilft dir das weiter?

Delphi-Quellcode:
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;
Du müsstest dir nur noch Gedanken über die Absicherung deines Codes machen. Was soll passieren, wenn unsinnige Werte in der Steuerdatei stehen?

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 Uhr.
Seite 2 von 2     12   

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