Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrays, dynamisch-->statisch (https://www.delphipraxis.net/46900-arrays-dynamisch-statisch.html)

Phistev 3. Jun 2005 15:43

Re: Arrays, dynamisch-->statisch
 
Deklarier dein dyn. Array als array of TVarRec, nicht als array of variant. Dann sollt's klappen (bei mir hat's funktioniert). Zum Typ TVarRec (System.pas):
Delphi-Quellcode:
  TVarRec = record { do not pack this record; it is compiler-generated }
    case Byte of
      vtInteger:   (VInteger: Integer; VType: Byte);
      vtBoolean:   (VBoolean: Boolean);
      vtChar:      (VChar: Char);
      vtExtended:  (VExtended: PExtended);
      vtString:    (VString: PShortString);
      vtPointer:   (VPointer: Pointer);
      vtPChar:     (VPChar: PChar);
      vtObject:    (VObject: TObject);
      vtClass:     (VClass: TClass);
      vtWideChar:  (VWideChar: WideChar);
      vtPWideChar: (VPWideChar: PWideChar);
      vtAnsiString: (VAnsiString: Pointer);
      vtCurrency:  (VCurrency: PCurrency);
      vtVariant:   (VVariant: PVariant);
      vtInterface: (VInterface: Pointer);
      vtWideString: (VWideString: Pointer);
      vtInt64:     (VInt64: PInt64);
  end;

Majortomster 7. Jun 2005 09:07

Re: Arrays, dynamisch-->statisch
 
Das hört sich doch sehr interessant an.
Aber wie füllt man ein TVarRec?
Bei einer einfach Zuweisung wie zuvor mit dem Variant Array klappt es nicht:
Delphi-Quellcode:
var
findarray : array of TVarRec;
...
begin
...
      for i := 0 to temp do
      begin
         findarray[i] := lds.FieldValues[tempStrs.Strings[i]]
      end;
...
end;
Wie geht das?

T

barf00s 7. Jun 2005 09:11

Re: Arrays, dynamisch-->statisch
 
in der unit variants gibts allerhand hilfsfunktionen/prozeduren die dir dabei helfen sollten

Majortomster 7. Jun 2005 09:19

Re: Arrays, dynamisch-->statisch
 
[Fehler] sqlreplace.pas(895): Inkompatible Typen: 'TVarRec' und 'Variant'

Das kommt bei der normalen Zuweisung ... ich kriegs nicht hin :|

T

Majortomster 7. Jun 2005 09:43

Re: Arrays, dynamisch-->statisch
 
Nächster Fehlschlag:
Mit folgender Änderung lässt es sich kompilieren und ausführen:

Delphi-Quellcode:
...
      for i := 0 to temp do
      begin
         findArray[i].VType := vtVariant;
         test := lds.FieldValues[tempStrs.Strings[i]];
         findarray[i].VVariant := @test;
      end;
...
Aber dies verursacht zur Laufzeit eine Zugriffsverletzung und zwar schon bei Zuweisung des VType-Feldes. "Zugriffsverletzung bei Adresse blabla in Modul 'delDB.exe'. Schreiben von Adresse 000000004."

Wie funktioniert dieses TVarRec? Nirgends findet man Dokus oder Beispiele :(

T

jim_raynor 7. Jun 2005 10:37

Re: Arrays, dynamisch-->statisch
 
Du sagst, das FindKey ein statisches Array braucht? Dann hat es doch definitiv eine feste Länge. Heisst du musst dich daran halten, ob du willst oder nicht. Wie sieht denn die Paramater Beschreibung von FindKey aus?

alzaimar 7. Jun 2005 10:58

Re: Arrays, dynamisch-->statisch
 
Angeblich : Variant == TVarData. Also solltest Du dein Array Of TVarData so füllen können:
Delphi-Quellcode:
for i := 0 to temp do
    findArray[i] := TVarData (lds.FieldValues[tempStrs.Strings[i]]);

semo 29. Sep 2007 09:43

Re: Arrays, dynamisch-->statisch
 
Delphi-Quellcode:
var
  Test : array [0..0] of TVarRec;
  extendedVal: Extended;
begin
  extendedVal := StrToFloat(Edit1.text);
  Test[0].VExtended := @extendedVal;
  Label1.Caption    := Format('%8.2f', [extended(Test[0].VExtended^)]);
so klappte es bei mir.
schau dir aber sicherheitshalber noch einmal die dokumentation zu tvarrec an.
wenn du was neues weist poste mal bitte.
interessiert mich auch das ganze.

kolbaschedder 29. Sep 2007 10:23

Re: Arrays, dynamisch-->statisch
 
Hallo Jungs,

ich hab das ganze hier nur mal so grob überflogen. Das mit den statischen Geschichten lässt sich für gewöhnlich mit folgendem Trick übergehen.

Delphi-Quellcode:

type
  TStaticArray = array[0..16000] of Integer;
  PStaticArray = ^TStaticArray;

procedure Wasauchimmer;
var
  pArr = PStaticArray;
begin
  getMem(pArr, 100*SizeOf(Integer));
// Jetzt Array Füllen
// Aufruf dann ungefähr so
  FindKey(pArr^, ..,..);

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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