Posts Tagged ‘Variant’

TStream -> Variant und zurück

Dienstag, Januar 20th, 2015

Zwar habe ich jetzt noch keine neue Version vom BVASystem fertig, aber trotzdem möchte ich meinen Entschluss, hier wieder öfters etwas zu schreiben, in die Tat umsetzen. Der Anlass dieses Blogs ist, das ich gerade sehr glücklich bin, da ich endlich sehen konnte, das meine internen Umstellarbeiten funktionieren. Bisher habe ich mehr oder weniger blind programmiert, ohne zu wissen, ob die gesetzten Ziele damit erreicht werden können. Jetzt, wo ich bereits 3 Worker-Tasks auf die generalisierte Datenbank umgestellt habe, weiß ich es. Und das schönste daran, ich komme nach der Umstellung mit deutlich weniger Code-Zeilen aus. Wiederkehrende Funktionen, wie zum Beispiel das Abfragen eines einzelnen Datenbankwertes habe ich allgemein gültig direkt in den generalisierten DB-Komponenten implementiert. So brauche ich jetzt nur noch eine einzige Zeile, wo ich vor der Umstellung zwischen 10 und 15 Zeilen gebraucht habe.

Als letztes Problem musste ich mich in den letzten Tagen noch um die Blob-Datenfelder kümmern. Diese ließen sich nämlich nicht  direkt wie alle anderen Parametern in einen SQL-Befehl codieren. Im speziellen musste ich ziemlich lange herumprobieren, bis ich ein Stream-Objekt in einen Variant und wieder zurück konvertieren konnte. Falls ihr mal vor einem ähnlichen Delphi-Problem stehen solltet ist hier meine Lösung:

function StreamToVariant(AStream:TStream):Variant;
var Hilf:Variant;
    P:Pointer;
begin
 VarClear(Hilf);
 Hilf := VarArrayCreate([0, AStream.Size−1], varByte);
 if AStream.Size > 0 then begin
  P := VarArrayLock(Hilf);
  AStream.ReadBuffer(P^, AStream.Size);
  VarArrayUnlock(Hilf);
 end;
 Result := Hilf;
end;
function VariantToStream(AVariant:Variant):TStream;
var S:TStream;
    P: Pointer;
begin
 S:= TMemoryStream.Create;
 P := VarArrayLock( AVariant );
 try
  S.Write(P^, VarArrayHighBound(AVariant,1)+1);
 finally
  VarArrayUnlock(AVariant);
 end;
 S.Position := 0;
 Result := S;
end;