Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Record mit DCom übertragen (https://www.delphipraxis.net/141021-record-mit-dcom-uebertragen.html)

GerMan62 30. Sep 2009 19:57


Record mit DCom übertragen
 
Hallo Gemeinde.

Ich habe folgenden Programmcode.
Delphi-Quellcode:
type
  TMesswert = record
                Bezeichnung : string[80]; // z.B. EMK A1-A2
                Wert       : string[80]; // z.B. 185.4
                Einheit    : string[80]; // z.B. V
                Min_Wert   : string[80]; // z.B. 180.0
                Max_Wert   : string[80]; // z.B. 190.0
              end;

  TMessreihe = record
                 Name : string[80];      // z.B. Messwerte oder VDE-Messwerte
                 Messwert : array[0..100] of TMesswert;
               end;

procedure TForm2.Button3Click(Sender: TObject);
var
  Messreihe : TMessreihe;
  P   : Pointer;
  Temp : OleVariant;
  X   : Integer;
begin
  for X := 0 to 50 do
  begin
    Messreihe.Messwert[X].Bezeichnung := SD_Grid.Cells[0,X + 1];
    Messreihe.Messwert[X].Wert       := SD_Grid.Cells[1,X + 1];
    Messreihe.Messwert[X].Einheit    := SD_Grid.Cells[2,X + 1];
    Messreihe.Messwert[X].Min_Wert   := SD_Grid.Cells[3,X + 1];
    Messreihe.Messwert[X].Max_Wert   := SD_Grid.Cells[4,X + 1];
  end;
 
  // in ein PSafeArray packen
  Temp := VarArrayCreate([0, SizeOf(Messreihe) - 1], varByte);
  P := VarArrayLock(Temp);
  try
    Move(Messreihe, P^, SizeOf(Messreihe));
  finally
    VarArrayUnlock(Temp);
  end;
end;
Nun meine Fragen:
Packe ich das ganze richtig in ein PSafeArray ein?
Kann ich die Record-Strucktur auch so schreiben?
Delphi-Quellcode:
type
  TMesswert = record
                Bezeichnung : string; // z.B. EMK A1-A2
                Wert       : string; // z.B. 185.4
                Einheit    : string; // z.B. V
                Min_Wert   : string; // z.B. 180.0
                Max_Wert   : string; // z.B. 190.0
              end;

  TMessreihe = record
                 Name : string;      // z.B. Messwerte oder VDE-Messwerte
                 Messwert : array[0..100] of TMesswert;
               end;
Vorab schonmal Danke für eure Hilfe.

himitsu 30. Sep 2009 20:15

Re: Record mit DCom übertragen
 
Also in diesem Fall müßtest die die Stringinhalte selber (einzeln) reinkopieren
oder alle einzeln übertragen, da von den String ja nur der interne Pointer im Array/Record liegen würde.



Ich weiß jetzt nicht in wie weit OleVariant und Variant kompatibel sind,
aber ich glaub dieses könnte gehn (da dein Array/Record nur aus Strings besteht)

es wäre dann ein Variant vom Typ varOleStr+varArray ... also ein OleString-/WideString-Array

String, AnsiString und UnicodeString sind ja nur delphi-eigene Erweiterungen und dürften in bei DCOM/OLE nicht gehn ... WideString ist nur eine Umleitung zum OLE-String

Delphi-Quellcode:
type
  TMesswert = record
                Bezeichnung : WideString; // z.B. EMK A1-A2
                Wert       : WideString; // z.B. 185.4
                Einheit    : WideString; // z.B. V
                Min_Wert   : WideString; // z.B. 180.0
                Max_Wert   : WideString; // z.B. 190.0
              end;

  TMessreihe = record
                 Name : WideString;      // z.B. Messwerte oder VDE-Messwerte
                 Messwert : array[0..100] of TMesswert;
               end;

  TMessTransfer = array[0..505] of WideString;
  PMessTransfer = ^TMessTransfer;

procedure TForm2.Button3Click(Sender: TObject);
var
  Messreihe : TMessreihe;
  P   : Pointer;
  Temp : OleVariant;
  X   : Integer;
begin
  for X := 0 to 50 do
  begin
    Messreihe.Messwert[X].Bezeichnung := SD_Grid.Cells[0,X + 1];
    Messreihe.Messwert[X].Wert       := SD_Grid.Cells[1,X + 1];
    Messreihe.Messwert[X].Einheit    := SD_Grid.Cells[2,X + 1];
    Messreihe.Messwert[X].Min_Wert   := SD_Grid.Cells[3,X + 1];
    Messreihe.Messwert[X].Max_Wert   := SD_Grid.Cells[4,X + 1];
  end;
 
  Temp := PMessTransfer(@Messreihe)^;
end;


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