![]() |
Hashtable in Delphi ? - vgl Jass
Seas,
da ich mich außerhalb von Delphi sehr viel mit der warcraft3 internen Programmiersprache Jass auseinandersetze wollte ich mal fragen wei ich ein solches Hashtable anlegen kann, dass von 2 parametern abhängt. In Jass sieht das so aus: call StoreInteger(var_Spielcache,var_Stringparameter_1, var_Stringparameter_2,var_IntegerValue) und mann kriegt den wert dann so: set i = GetStoredInteger(var_Spielcache,var_Stringparamete r_1,var_Stringparameter_2) ich hab jetzt mal im internet gesucht und da wurde ein hashtable mit nur einem parameter gezeigt .. was ja aber nicht meinem wunsch entspricht nun meine eigentlich frage: Ist es möglich ein von 2 parametern abhängiges hashtable zu erstellen, wenn ja wie? |
Re: Hashtable in Delphi ? - vgl Jass
Erstelle einen verknüpften Schlüssel, z.b.:
Delphi-Quellcode:
Hashmaps gibts
Key := IntToStr (IntegerVar)+String1+String2;
![]() |
Re: Hashtable in Delphi ? - vgl Jass
hmm ich habs implementiert gekriegt (das erste mal dass ich zeug implementier^^)
und ich hab jetzt einfach eine variable deklariert mit dem typ der hash class, nun bin ich mir nicht ganz sicher wie ich das benutze bei Add soll ich ja einen key angeben und ne data wenn ich jetzt z.b. unter key "blubb" die zahl 8 speichern will, wie mach ich das dann? btw mit pointern kenn ich mich nicht aus deshalb.. und vor allem liefert der mir nen zugriffserrror bei hash(meine variable).create .. |
Re: Hashtable in Delphi ? - vgl Jass
Zeig mal deinen Code, eventuell wäre ein Crashkurs Delphi auch was für Dich.
|
Re: Hashtable in Delphi ? - vgl Jass
Delphi-Quellcode:
also das mit dem edit feld hab ich jetzt rumprobiert^^
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, csDictionary; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Edit2: TEdit; Button2: TButton; Edit3: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Hash:TStringDictionary; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Hash.Create; end; procedure TForm1.Button1Click(Sender: TObject); begin Hash.Add(edit1.text,hash.FieldAddress(edit3.text)); end; end. naja crashkurs delphi ... also ich lern halt über die schule delphi und wir haben jetzt "schon" filehandling (write, read usw.) abgeschlossen, (immerhin bin ich klassenbester ~~), aber ich habe auch schon nach tutorialen gesucht um pointer, dlls oder hooks zu verstehen.. hab aber keine für mich verständlichen gefunden wenn du mir einen crashkurs zeigen kann der solche dinge erklärt oder einen der halt weiterführender ist ab dem zeug was wir machen wäre ich dir dankbar aber ich habe jetzt halt bloß eine möglichkeit gesucht einfach diese 2 jass funktionen iwie in delphi zu benutzen weil ich das einfach in jass so gewohnt bin (da mach ich alles mit gamecache) btw. wenn du ein tutorial zur hand hättest welches erklärt wie man dynamisch theoretisch unendlich viele neuer komponenten erstellt welche sich dann periodisch bewegen und auf die man dann auch irgendwie wieder zugreifen kann erstellt. wenn du nicht verstehst was ich meine schreibs, weil ich glaube ich hab dass sehr komisch ausgedrückt MfG |
Re: Hashtable in Delphi ? - vgl Jass
Es heißt
Delphi-Quellcode:
und was willst Du in die Hashmap einfügen?
Hash := TStringDictionary.Create
Ich lege Dir nochmals einen Crashkurs Delphi ans Herz. |
Re: Hashtable in Delphi ? - vgl Jass
ja das war jetzt ein leichtsinnsfehler :D :angel:
wenn du mir einen ans herz legst könntest du dann auch einen link posten? :gruebel: und wie wende ich jetzt genau den add befehl an um z.b. einen integer abzuspeichern? was ich einfügen will? - im moment test ich nur mal wie gut das funktioniert und wenn es so klappt wie ich mir das denke dann will ich das eigentlich ganz vielfältig in meinen projekten einsetzen um strings oder integers abzuspeichern... im endeffekt such ich schon länger nach der möglichkeit einfach sagen wir z.b. einfach auf button click labels zu erstellen die sich dann z.b. auf die andere seite des bildschirms bewegen wo sie dann letztendlich destroyd werden... also das sind jetzt nur beispiele und ich denke wenn ich dann irgendwie bei button click timer erstelle und dann per handle wert das label an den timer kette, könnte ich sowas machen und für diese vernetzung wollte ich wie in jass hashtable benutzen |
Re: Hashtable in Delphi ? - vgl Jass
Du kannst einen Integer als Pointer behandeln, weil beide 4-Bytes belegen.
Also so:
Delphi-Quellcode:
Das 'Pointer(x)' nennt sich 'type casting' und gaukelt dem Compiler vor, x wäre ein Pointer.
MyHash.Add(Key, Pointer (IntegerVariable));
... MyHasg.Find(Key, Pointer (IntegerVariable)); Google mal nach 'Crashkurs Delphi'. Ich habe dort bei ![]() |
Re: Hashtable in Delphi ? - vgl Jass
ich hab in den crashkurs mal reingeschaut, muss mich später damit noch intesiver befassen..
Delphi-Quellcode:
ich hab jetzt versucht eine procedure zu schreiben die einen timer und ein label erstellt. Per hashtable soll nun an den handlewert des timers der handlewert des labels gehängt werden. ich muss jetzt noch zur vollendung dieser start procedure den timer starten und im irgendwie als callback procedure eine andere zuweisen. in dieser callback function soll dann anhand des handles des ausgelaufenen timers der timer ermittelt und über die vernetzung wieder das label ermittelt werden... mein plan wäre es nun gewesen das label (was vll eine kugel oder ein projektil oder so darstellen könnte) einfach kurzerhand zu verschieben und dann auf das nächste timer intervall zu warten ..
var
t:TTimer; s:Tlabel; begin s:=tlabel.Create(form1); t:=ttimer.create(form1); Hash.Add(I2S(Handle des Timers),Pointer(Handle des Labels)); wie gesagt dass ist mein ansatz nur weiß ich erstens nicht wie ich das handle von timern und labels herkriege (hab schon alles durchsucht :wall: ) und wie ich an die callback procci des timers rankommen ... wie ich auf so eine bescheuerte idee komme? in wc3 ist das standart projektil bewegungmethode und ich bin es nunmal gewohnt so zu proggen :D und mir eröffnen sich mit dieser methode in delphi ganz neue möglichkeiten :D wenn jemand was weiß wie ich das bewerkstelligen könnte ... MfG |
Re: Hashtable in Delphi ? - vgl Jass
Der Callback eines TTimers ist TTimer.OnTimer(Sender: TObject). Die Variable Sender enthält den Pointer auf das auslösende Objekt, in diesem Fall eben den entsprechenden Timer, worüber du ihn ohne weitere Mittel identifizieren kannst.
Timer und Lables haben übrigens kein Handle im eigentlichen Wortsinn, da beides keine eigenständigen Fenster sind. Was du vermutlich eher meinst ist die Referenz (der Pointer) auf die Objekte, und dieser verbirgt sich direkt hinter den Variablennamen. Wenn du z.B. ein TEdit auf ein Formular ziehst, wird per default eine Variable "Edit1" des Formulars angelegt. Mit einem Typecast der Art Integer(Edit1) oder Pointer(Edit1) oder Cardinal(Edit1) kannst du nun die Speicheradresse erhalten, an der das Objekt beginnt, wordurch es eindeutig identifiziert ist. Das alles, und auch die Hashmap, brauchst du jedoch nicht wirklich. Angenommen du möchtest 4 Timer haben, und eine einzige Methode, die die Events verarbeitet, und jeweils etwas in ein anderes Label schreibt, so würde man vermutlich eher folgendermaßen daran gehen:
Delphi-Quellcode:
In dem Fall identifizierst du die Timer über den selbst vergebenen Wert von Tag, da eine Identifikation anhand der Speicheradresse von Programmaufruf zu Programmaufruf verschieden sein kann. Dadurch sparst du dir jedoch das zusätzliche Mitführen einer Zuordnungsliste, da die Zuordnung implizit möglich ist. Es gibt noch etliche weitere Möglichkeiten das zu bewerkstelligen, und welche die beste ist, ist immer sehr detailiert vom jeweiligen Einsatzzweck abhängig. Fakt ist, dass du in Delphi wahrscheinlich sehr viel mehr Möglichkeiten und Strukturen zur Wahl hast, als im WC3 Script, weswegen sich ein Grundlagentutorial wohl sehr anbietet. Eine Programmiersprache ist doch schon ein deutlich anderes Kaliber als ein Gamescript, und man kann vermutlich einiges über weit weniger Umwege erreichen, als du es gewohnt bist.
// 4 TTimer und 4 TLabel aufs Formular ziehen, und jedem Timer in der Eigenschaft "Tag" einen anderen Wert zuweisen (1-4 z.B.)
. . procedure Form1.OnTimers(Sender: TObject); begin case (Sender as TTimer).Tag of 1: Label1.Caption := 'Timer 1 ist cool'; 2: Label2.Caption := 'Timer 2 ist cooler'; 3: Label3.Caption := 'Timer 3 - der Wahnsinn'; 4: Label4.Caption := 'Timer 4 kann alles'; end; end; // Allen Timern dann diese Prozedur im OI als Eventhandler zuweisen Gruß, Medium |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr. |
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