AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

How to TValue / TOmniValue

Ein Thema von haentschman · begonnen am 28. Dez 2013 · letzter Beitrag vom 28. Dez 2013
Antwort Antwort
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#1

How to TValue / TOmniValue

  Alt 28. Dez 2013, 08:33
Guten Morgen alle...

Ich habe mich mal intensiv mit der Omni TL beschäftigt. Dazu habe ich sowohl das Handbuch als auch die Beispiele von den Delphi Tagen im Gebrauch.

Nun heißt es ja überall:
Zitat:
In short, TOmniValue is a smart record (record with functions and operators) which functions similar to a Variant or TValue but is faster. It can store simple data types, objects, interfaces and (in Delphi 2009 and newer) records.
...nun versuche ich der Funktion
CreateWorkItem(Value: TOmniValue) des BackgrounndWorkers ein TObject(Instanz)zu übergeben. Egal wie ich es anstelle(direkt, extra TOmniValue, gecasted etc.), alle Versuche laufen in Fehler:
Zitat:
[DCC Fataler Fehler] backgroundWorker1.pas(119): F2084 Interner Fehler: URW1136
Zitat:
[DCC Fataler Fehler] BackgroundWorker.dpr(16): F2084 Interner Fehler: O780
Im Großen und Ganzen läuft es darauf hinaus, daß ich zu dämlich bin TOmniValue zu benutzen...

Die Suche nach einem "How to" brachte nix weltbewegendes zum Vorschein...

Ich bitte Euch hiermit um Erleuchtung.


Eine mögliche Lösung:
Delphi-Quellcode:
TTest = class
  strict private
    FDBMS: Integer;
  public
    property DBMS: Integer read FDBMS write FDBMS;
  end;
.
.
.
FTest: TTest; // Instanz ist erzeugt
.
.
.
FBkGet := Parallel.BackgroundWorker;
FBkGet.NumTasks(Environment.Process.Affinity.Count * 2);
FBkGet.OnRequestDone(
  procedure(const Sender: IOmniBackgroundWorker;
    const workItem: IOmniWorkItem)
  begin
      MarkLoaded(TTest(TOmniValue(workItem.Data).AsObject).DBMS); // Cast Orgie zurück
    end);
FBkGet.Execute(RetrievePageBk);

FBkGet.Schedule(FBkGet.CreateWorkItem(TOmniValue(FTest).AsObject)); // Cast Orgie um Objekt abzulegen
...funktioniert soweit. Nur ist mir die Cast Orgie zuwieder . Geht das besser?

Geändert von haentschman (28. Dez 2013 um 10:11 Uhr)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 10:03
Wenn du einen internal error kriegst, hast du wohl alles richtig gemacht.
Delphi hat's nur nicht kapiert.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#3

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 10:26
Danke Elvis...
Ich habe inzwischen oben editiert. Ohne casten geht es wahrscheinlich nicht. Nur ein Integer wird bei CreateWorkItem() als Parameter ohne casten genommen. Alles Andere resultiert in o.g. Fehlern.


Geändert von haentschman (28. Dez 2013 um 10:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.138 Beiträge
 
Delphi 12 Athens
 
#4

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 13:57
Jupp, die "Internal Errors" sind ja "Bugs" im Compiler, der da irgendwo ein Problem hat.

- Da kannst du nur selber "schnell" versuchen irgendwas "Schwindliches" anzustellen.
- Oder du wendest dich an Embarcadero und bisstest darum, daß der Bug entfernt wird. (das kannst du inzwischen wohl praktisch vergessen)
- Oder du wendest die an die Omni-Läute, ob die als Unterstützung für dein altes Delphi, versuchen irgendwas an ihrem Projekt umzubauen, so daß es nicht mehr in diesen Bug reinläuft.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Dez 2013 um 14:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#5

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 14:05
Hmmm...
...dann bin ich ja nicht der doofe? (Kommt selten genug vor)

Meinst du so etwas? Auch ein Record in Verbindung mit TValue http://qc.embarcadero.com/wc/qcmain.aspx?d=93738
Zitat:
Unterstützung für dein altes Delphi
...grenzt bei XE schon fast an Beleidigung.

Geändert von haentschman (28. Dez 2013 um 14:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.138 Beiträge
 
Delphi 12 Athens
 
#6

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 14:17
Das Erste kommt dem Nahe, was du eigentlich versuchen wolltest, also via Implicit-Operator, nur über eine "eigene" Variable.
Und das Letzte wäre ein explititer Cast, welchen ich eigentlich empfehlen würde.
Delphi-Quellcode:
// externer impliziter Cast über zusätzliche Variable
MyOmniValue := FTest; // MyOmniValue := TObject(FTest); so sähe die externe Variante des letzten Tipps aus (siehe nächsten Code-Block)
FBkGet.Schedule(FBkGet.CreateWorkItem(MyOmniValue));

// externe explizite Zuweisung über zusätzliche Variable
MyOmniValue.AsObject := FTest;
FBkGet.Schedule(FBkGet.CreateWorkItem(MyOmniValue));

// externer expliziter Cast über zusätzliche Variable
MyOmniValue := TOmniValue.CastFrom<TTest>(FTest);
FBkGet.Schedule(FBkGet.CreateWorkItem(MyOmniValue));

// interner expliziter Cast über automatisch generierte lokale Variable
FBkGet.Schedule(FBkGet.CreateWorkItem(TOmniValue.CastFrom<TTest>(FTest)));

Dein Rumgecaste sieht eher so bissl "sinnlos" aus.
TTest >= expliziter Cast über den TObject-Implicit-Operator => TOmniValue => aulesen über AsObject
=> TObject => automatischer impliziter Case über den selben Implicit-Operator => TOmniValue => TOmniValue => übergabe als Parameter

Wenn Letzteres geht, dann hätte ich es eher nochmal so versucht, damit der Compiler direkt mit dem TObject arbeitet und man die erste Zeile des vorhin genannten Casts auslässt:
FBkGet.Schedule(FBkGet.CreateWorkItem(TObject(FTest)));


[Edit] Oh, es ist schon gefixt.
Nja, selbst wenn du es selber gemeldet hättest, dann wäre es bestimmt sowieso nicht als Hotfix/Update für ältere Delphis gekommen.
"Kaufen sie doch was Neues" ist einfach zu nett.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Dez 2013 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#7

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 15:45
Danke...
das sind ja quasi nur verschiedene "Schreibweisen" um den Compiler zu verwirren Die meisten davon hatte ich schon durch...

Hier noch mal eine Zusammenfassung:
Delphi-Quellcode:
Test:= 'Test';
FBkGet.Schedule(FBkGet.CreateWorkItem(Test));
-> Fehler: O780
FBkGet.Schedule(FBkGet.CreateWorkItem('Test')); -> Compiliert
FBkGet.Schedule(FBkGet.CreateWorkItem(FTest)); -> Fehler: O780
FBkGet.Schedule(FBkGet.CreateWorkItem(TObject(FTest))); -> Compiliert
FBkGet.Schedule(FBkGet.CreateWorkItem(TOmniValue.CastFrom<TTest>(FTest))); -> Compiliert
Delphi-Quellcode:
MyOmniValue := TOmniValue.CastFrom<TTest>(FTest);
FBkGet.Schedule(FBkGet.CreateWorkItem(MyOmniValue));
-> Compiliert
Delphi-Quellcode:
MyOmniValue.AsObject := FTest;
FBkGet.Schedule(FBkGet.CreateWorkItem(MyOmniValue));
-> Compiliert
Delphi-Quellcode:
MyOmniValue:= FTest;
FBkGet.Schedule(FBkGet.CreateWorkItem(MyOmniValue));
-> Compiliert

und nun kommt der Hit: Ich habe wahrscheinlich zig Varianten schon probiert gehabt. Immer bekam ich O780.
http://www.delphipraxis.net/1111175-post300.html
Zitat:
Mich nervt der "F2084 Internal Error: O780", der erst weggeht, wenn man Delphi neustartet
Super! Wieder einen Haufen Zeit versenkt.

Danke an Alle.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.138 Beiträge
 
Delphi 12 Athens
 
#8

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 15:50
[DELPHI]
FBkGet.Schedule(FBkGet.CreateWorkItem(TObject(FTest))); -> Compiliert
Irgendwie hat da der Compiler ein Problemchen mit der Klassen-Vererbung
und kratzt ab, wo er TTest als TObjekt verwenden will.

Mein schöner Thread ... wollte da vor 'ner Weile reinschreiben, aber der wurde ja leider geschlossen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#9

AW: How to TValue / TOmniValue

  Alt 28. Dez 2013, 16:01
Das mit der String Übergabe ist auch witzig...

Viel schlimmer finde ich aber den IDE Neustart. Wenn das nicht gewesen wäre, bzw. was ich nicht gemacht hatte, wäre ich früher auf eine Lösung gekommen. Dann hätte es aber diese Wissenssammlung nicht gegeben.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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