Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array Problem (https://www.delphipraxis.net/58102-array-problem.html)

bergamo34 1. Dez 2005 12:03


Array Problem
 
Hallo,


Das folgende type ist ein Auszug aus dem Twain.pas (DelphiTwain-Component bei sourceforge.net)

Delphi-Quellcode:

TW_EXTIMAGEINFO = packed record
    NumInfos: TW_UINT32;
    Info: array[0..0] of TW_INFO;
  end;
mein Problem:
ich brauche aber mehr als nur ein Info (siehe unten procedure Auszug). Im TW_EXTIMGAINFO-Struct ist das Info als ein Array von der Länge 1 definiert! Wie kann ich das lösen?

Delphi-Quellcode:

procedure Tfrm_main.DelphiTwain1SourceSetupFileXfer(Sender: TObject; const Index: Integer);
var vTWExtImageInfo: TW_EXTIMAGEINFO;
    sBarcodeText: String;
begin
  with vTWExtImageInfo do
  begin
    NumInfos := 4;
    Info[0].InfoID := TWEI_BARCODETYPE;
    Info[0].ItemType := TWTY_UINT32;
    Info[0].NumItems := 0;
    Info[0].CondCode := 0;
    Info[0].Item := 0;

    Info[1].InfoID := TWEI_BARCODETYPE;
    Info[1].ItemType := TWTY_UINT32;
    Info[1].NumItems := 0;
    Info[1].CondCode := 0;
    Info[1].Item := 0;

    Info[2].InfoID := TWEI_BARCODETEXTLENGTH;
    Info[2].ItemType := TWTY_UINT32;
    Info[2].NumItems := 0;
    Info[2].CondCode := 0;
    Info[2].Item := 0;

    Info[3].InfoID := TWEI_BARCODETEXT;
    Info[3].ItemType := 0;
    Info[3].NumItems := 0;
    Info[3].CondCode := 0;
    Info[3].ItemType := 0;

    .....
gruß

bergamo34

Khabarakh 1. Dez 2005 12:11

Re: Array Problem
 
*selbstzitier*
Zitat:

Zitat von Khabarakh
Das wird auch oft für "hausgemachte" dynamische Arrays benutzt:
Delphi-Quellcode:
PColor32Array = ^TColor32Array;
  TColor32Array = array [0..0] of TColor32;
TBitmap32 verwaltet seinen Pixel-Speicher selbst, über obigen Typ kann man aber trotzdem wie auf ein Array zugreifen:
Delphi-Quellcode:
for i := 0 to Bit.Width * Bit.Height - 1 do
  Bit.Bits[i] := clWhite32;
Bereichsprüfung sollte natürlich deaktiviert sein :wink: .

Das Recordfeld ist also nur ein Zeiger auf das erste Item, du kannst problemlos auf Indizes bis NumInfos - 1 zugreifen.

Robert Marquardt 1. Dez 2005 12:18

Re: Array Problem
 
Das ist die Uebertragung eines Sprachfeatures von C.
Das Record ist nur ein Header einer laengeren Liste.
In C kann man nun innerhalb des Records ein Array-Element deklarieren mit Arraylaenge 0.
Damit traegt das Element nicht zur Laenge (sizeof) des Records bei.
Das Element dient nur dazu das man seine Adresse bilden kann. Damit bekommt man die Adresse direkt hinter dem Record.

In Delphi kann man das nicht genau nachbilden, da ein leeres Array nicht erlaubt ist und daher in die Recordgroesse eingeht.
Da diese Headerstruktur aber sowieso nur ein Teil eines laengeren Puffers ist, ist das nicht so tragisch.

bergamo34 1. Dez 2005 14:35

Re: Array Problem
 
danke für die Antworten, aber mir ist immer noch nicht ganz klar!

Zitat:

Bereichsprüfung sollte natürlich deaktiviert sein
???

bei dem obigen Beispiel kommt die Fehlermeldung "Konstantenausdruck verletzt untere Grenzen".

marabu 1. Dez 2005 15:53

Re: Array Problem
 
Du bekommst doch bestimmt auch gesagt, in welcher Zeile der Fehler auftritt - oder?

Grüße vom marabu

bergamo34 1. Dez 2005 19:50

Re: Array Problem
 
ja, Fehlerzeile:

Info[1].InfoID := TWEI_BARCODETYPE;

marabu 2. Dez 2005 11:16

Re: Array Problem
 
Die Meldung in Verbindung mit dieser Code-Zeile macht mich zwar stutzig, aber was mich viel mehr stutzen lässt ist die Tatsache, dass du eine nur zur Redefinition gedachte Speicherstruktur direkt befüllen möchtest. Du musst denn Speicher dynamisch zuordnen, wenn du mehr als einen Info-Record befüllen willst.

Grüße vom marabu

bergamo34 2. Dez 2005 14:36

Re: Array Problem
 
ja aber wie???
bin leider noch nicht weiter gekommen.

marabu 2. Dez 2005 20:22

Re: Array Problem
 
Hallo.

Du musst den Speicher für deine vier Image Descriptoren dynamisch anfordern:

Delphi-Quellcode:
var
  pExtImgInfo: PTW_ExtImageInfo;
  pInfo: PTW_Info;
  iCount, iSize: cardinal;
  sBarcodeText: string;
begin
  iCount := 4; // Anzahl der Infos
  iSize := SizeOf(TW_UINT32) + iCount * SizeOf(TW_INFO);
  GetMem(pExtImgInfo, iSize);

  pExtImgInfo^.NumInfos := iCount;

  pInfo := @pExtImgInfo^.Info; // auf erstes item zeigen
  with pInfo^ do
  begin
    InfoID := TWEI_BARCODETYPE;
    ItemType := TWTY_UINT32;
    NumItems := 0;
    CondCode := 0;
    Item := 0;
  end;

  Inc(pInfo); // auf nächstes Item zeigen
  with pInfo^ do
  begin
    InfoID := TWEI_BARCODETYPE;
    ItemType := TWTY_UINT32;
    NumItems := 0;
    CondCode := 0;
    Item := 0;
  end;

  // ...

  FreeMem(pExtImgInfo, iSize);  // Speicher wieder freigeben
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz