Forum > Windows
Newbie problem with TDictionary
(1/1)
phunkz:
Hi there,
using fpc 3.2.2 in ide lazarus 3.4 and today updated to 3.6 (no change in behaviour) under win 10 in a Virtualbox VM with enough free ram
I desperately want to create a global Database object which holds data in a key-value-store using a Tdictionary.
Later on i want to use a real database for persistent storage. but for now a TDict should do the job.
Now i have created a unit which defines a class TDatabase with a private KeyValueDict: TDictionary , its methods constructor create/get/store/destructor destroy/and instantiates a variable GlobalDatastore
But after "create" it seems, while stepping with the debugger, that the destructor is directly called afterwards which i dont understand.
is anything wrong with the method "create"?
Any access via "get" to KeyValueDict throws a read memory error. Compiling is fine but lots of warnings making me nervous.
Ive used the some AIs and the search function in this forum but could not find a solution
Ive added C:\lazarus\fpc\3.2.2\source\packages\rtl-generics\src to the path. Without this stepping into TDictionary was not possible.
Any Ideas?
I'm a total newbie to pascal but not for programming in other languages so its possible that ive done some pretty dumb mistakes.
Many thanks in advance.
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---unit TT_database;// shared object {$mode Delphi} {$H+} interface uses Classes, SysUtils, Generics.Collections, Variants; type TDataBase = class private KeyValueDict: TDictionary<string, Variant>; public constructor Create; destructor Destroy; override; procedure Store(const Key: string; const Value: Variant); function Get(const Key: string): Variant; end; var GlobalDatastore: TDataBase; implementation { TDataBase } constructor TDataBase.Create;begin KeyValueDict := TDictionary<string, Variant>.Create;end; destructor TDataBase.Destroy;begin KeyValueDict.Free; inherited;end; procedure TDataBase.Store(const Key: string; const Value: Variant);begin KeyValueDict.Add(Key, Value);end; function TDataBase.Get(const Key: string): Variant;begin if KeyValueDict.ContainsKey(Key) then Result := KeyValueDict[Key] else Result := Null; // Verwende Null anstelle eines leeren Strings für Variantend; initialization GlobalDatastore := TDataBase.Create; finalization GlobalDatastore.Destroy; end.
silvercoder70:
Hi,
I have used your code exactly as is and it actually worked for me and behind a button put code ...
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure TForm1.Button1Click(Sender: TObject);var s: string;begin GlobalDatastore.Store('a', '1'); s := GlobalDatastore.Get('a'); showMessage(s);end;
Please keep in mind I am using the 4.0RC1 and FPC 3.2.2.
As a side-note I did set breakpoints in all of your functions/methods as well. What versions are you using?
Thaddy:
Your code is a bit, well, over the top for what you actually mean.
Maybe you can do it like this:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---unit mydatab;{$mode delphi}interfaceuses Generics.Collections; // that is all you need type TYourDatabase = TDictionary<string, Variant>; var GlobalDatastore: TYourDatabase; implementation initialization GlobalDatastore := TYourDatabase.Create; finalization GlobalDatastore.Free; end.
I would not call your data store TDatabase, since that is an existing and often used class.
I also would not use store and get if all they do is calling add and retrieve, so I removed that.
Above unit is tested and working.
phunkz:
Thanks to both,
working on your tipps, especially on the naming conventions,
i found the error, really dumb as previously announced...
I had an identically named local variable in the calling unit...
Navigation
[0] Message Index