AGB  ·  Datenschutz  ·  Impressum  







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

Hashtable in Delphi ? - vgl Jass

Ein Thema von Coder1990 · begonnen am 5. Jul 2008 · letzter Beitrag vom 8. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#1

Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 13:36
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?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 15:25
Erstelle einen verknüpften Schlüssel, z.b.:
Key := IntToStr (IntegerVar)+String1+String2; Hashmaps gibts hier
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 16:13
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 ..
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 18:15
Zeig mal deinen Code, eventuell wäre ein Crashkurs Delphi auch was für Dich.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 19:01
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 19:50
Es heißt
Hash := TStringDictionary.Create und was willst Du in die Hashmap einfügen?

Ich lege Dir nochmals einen Crashkurs Delphi ans Herz.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 20:17
ja das war jetzt ein leichtsinnsfehler

wenn du mir einen ans herz legst könntest du dann auch einen link posten?

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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Hashtable in Delphi ? - vgl Jass

  Alt 5. Jul 2008, 20:42
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Hashtable in Delphi ? - vgl Jass

  Alt 6. Jul 2008, 00:25
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 ) 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
und mir eröffnen sich mit dieser methode in delphi ganz neue möglichkeiten

wenn jemand was weiß wie ich das bewerkstelligen könnte ...

MfG
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Hashtable in Delphi ? - vgl Jass

  Alt 6. Jul 2008, 03:20
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:43 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