Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hashtable in Delphi ? - vgl Jass (https://www.delphipraxis.net/116738-hashtable-delphi-vgl-jass.html)

Coder1990 5. Jul 2008 12:36


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?

alzaimar 5. Jul 2008 14:25

Re: Hashtable in Delphi ? - vgl Jass
 
Erstelle einen verknüpften Schlüssel, z.b.:
Delphi-Quellcode:
Key := IntToStr (IntegerVar)+String1+String2;
Hashmaps gibts hier ;-)

Coder1990 5. Jul 2008 15:13

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 ..

alzaimar 5. Jul 2008 17:15

Re: Hashtable in Delphi ? - vgl Jass
 
Zeig mal deinen Code, eventuell wäre ein Crashkurs Delphi auch was für Dich.

Coder1990 5. Jul 2008 18:01

Re: Hashtable in Delphi ? - vgl Jass
 
Delphi-Quellcode:
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.
also das mit dem edit feld hab ich jetzt rumprobiert^^

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

alzaimar 5. Jul 2008 18:50

Re: Hashtable in Delphi ? - vgl Jass
 
Es heißt
Delphi-Quellcode:
Hash := TStringDictionary.Create
und was willst Du in die Hashmap einfügen?

Ich lege Dir nochmals einen Crashkurs Delphi ans Herz.

Coder1990 5. Jul 2008 19:17

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

alzaimar 5. Jul 2008 19:42

Re: Hashtable in Delphi ? - vgl Jass
 
Du kannst einen Integer als Pointer behandeln, weil beide 4-Bytes belegen.
Also so:
Delphi-Quellcode:
MyHash.Add(Key, Pointer (IntegerVariable));
...
MyHasg.Find(Key, Pointer (IntegerVariable));
Das 'Pointer(x)' nennt sich 'type casting' und gaukelt dem Compiler vor, x wäre ein Pointer.

Google mal nach 'Crashkurs Delphi'. Ich habe dort bei www.dsdt.info etwas gefunden, kann aber nicht beurteilen, wie gut dieses Tutorial ist.

Coder1990 5. Jul 2008 23:25

Re: Hashtable in Delphi ? - vgl Jass
 
ich hab in den crashkurs mal reingeschaut, muss mich später damit noch intesiver befassen..

Delphi-Quellcode:
var
t:TTimer;
s:Tlabel;
begin
s:=tlabel.Create(form1);
t:=ttimer.create(form1);
Hash.Add(I2S(Handle des Timers),Pointer(Handle des Labels));
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 ..
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

Medium 6. Jul 2008 02:20

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:
// 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
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.


Gruß,
Medium


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.
Seite 1 von 2  1 2      

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