Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Array oder Integer? (https://www.delphipraxis.net/179612-array-oder-integer.html)

rhodan 19. Mär 2014 20:34

Array oder Integer?
 
Hi!

Ich bastle an einem geografie-lernprogramm für schüler. ich benutze die komponente HotSpotImage von TMS die es mir ermöglicht verschiedene Länder anklickbar zu machen. Das Problem bei Inselgruppen bzw in diesem Fall bei kanada ist es das Wasser zwischen den "Inseln" bzw dem "festland" liegt, ich also für kanada mehr als einen Hotspot habe der hervorgehoben werden soll wenn man mit der maus darüber fährt..

Hotspot 50-68 gehören alle zu Kanada und sollen hervorgehoben werden, wann immer man mit der maus über einen von ihnen fährt...momentan ist es allerdings so, das NUR alles hervorgehoben wird wenn ich über hotspot 50 fahre...ich bin mir nicht sicher ob ich 50-68 in nem array deklarieren sollte? rein als integer scheint es nicht zu funktionieren ...

Code:
procedure Tworldmapsource.hsiHotSpotEnter(Sender: TObject; HotSpot: THotSpot);
var
 i:Integer;
begin
if hotspot = hsi.HotSpotByName('Kanada') then
begin
for I := 50 to 68 do

hsi.HotSpots[i].HERVORHEBEN:= true;
end;
end;
hat jemand ne ahnung wo der fehler liegt? "I" startet natürlich bei 50, aber ich dachte delphi würde auch die anderen zahlen bis 68 gleichwertig behandeln..

wie deklariere ich die 50-68 das die zahlenfolge nicht von vorn bis hinten abgearbeitet wird?
hoffe ich habs einigermaßen gut erklärt

danke für hilfe
robin

nuclearping 19. Mär 2014 20:49

AW: Array oder Integer?
 
Der Fehler liegt nicht in dem Code, den du uns gezeigt hast. Die Schleife ist korrekt.

Werden denn mehr Bereiche hervorgehoben, wenn du statt der Schleife zB nur das machst?
Delphi-Quellcode:
if hotspot = hsi.HotSpotByName('Kanada') then
  begin
    hsi.HotSpots[50].HERVORHEBEN:= true;
    hsi.HotSpots[51].HERVORHEBEN:= true;
    hsi.HotSpots[52].HERVORHEBEN:= true;
  end;
Wenn nicht, dann liegt der Fehler irgendwo anders.

Sir Rufo 19. Mär 2014 20:53

AW: Array oder Integer?
 
Hast denn irgendwie eine Beziehung zwischen Kanada und den Hotspots von 51-68 hergestellt?

Delphi-Quellcode:
HotspotByName
gibt den ersten Eintrag zurück, der unter dem Namen gefunden wird.

Also musst du anders vorgehen.

Hole dir den Namen zum aktuellen Hotspot.
Durchlaufe alle Hotspots und vergleiche den Namen mit dem gefundenen. Bei Übereinstimmung diesen Hotspot hervorheben

Popov 19. Mär 2014 20:55

AW: Array oder Integer?
 
@rhodan

Ich würde in einem Array festlegen welche Hotspts zusammengehören. Wird eines davon angeklickt, gehst du die ganze Liste durch und aktivierst du auch die anderen.

rhodan 19. Mär 2014 20:59

AW: Array oder Integer?
 
ne..selbst wenn ich den code probiere
Code:
procedure Tworldmapsource.hsiHotSpotEnter(Sender: TObject; HotSpot: THotSpot);
var
 i:Integer;
begin
if hotspot = hsi.HotSpotByID('Kanada') then
begin


hsi.HotSpots[50].ShowClick:= true;
hsi.HotSpots[51].ShowClick:= true;
hsi.HotSpots[52].ShowClick:= true;
hsi.HotSpots[53].ShowClick:= true;
hsi.HotSpots[54].ShowClick:= true;
hsi.HotSpots[55].ShowClick:= true;
hsi.HotSpots[56].ShowClick:= true;
hsi.HotSpots[57].ShowClick:= true;
hsi.HotSpots[58].ShowClick:= true;
hsi.HotSpots[59].ShowClick:= true;
hsi.HotSpots[60].ShowClick:= true;
hsi.HotSpots[61].ShowClick:= true;
hsi.HotSpots[62].ShowClick:= true;
hsi.HotSpots[63].ShowClick:= true;
hsi.HotSpots[64].ShowClick:= true;
hsi.HotSpots[65].ShowClick:= true;
hsi.HotSpots[66].ShowClick:= true;
hsi.HotSpots[67].ShowClick:= true;
hsi.HotSpots[68].ShowClick:= true;
end;
end;
hab ich das selbe ergebnis..scheint so als würde die komponente nur auf den hotspot reagieren der als erstes KANADA heisst...sowas blödes...alle anderen inseln werden einzelnd hervorgehoben, nur wenn ich auf den hotspot 50 gehe markiert er alle...grrrrrr

@ sir rufo:
ja wenn ich einen hotspot erstelle bekommt er automatisch ne nummer und ich habe allen Kanada als namen gegeben

@ popov: haste nen beispiel? mit arrays hab ich bis jetzt kaum gearbeitet leider, habs per google kurz versucht aber bin auf granit gestossen

Sir Rufo 19. Mär 2014 21:05

AW: Array oder Integer?
 
Kannst du von dem Hotspot den zugeordneten Namen holen?
Dann ist dein Problem gelöst

rhodan 19. Mär 2014 21:13

AW: Array oder Integer?
 
den namen holen? ich dachte das hätte ich mit
Code:
if hotspot = hsi.HotSpotByName('Kanada') then
begin
schon getan?
ich hatte gehofft er greift damit auf alle hotspots zu die diesen namen tragen...ich würde statt der integer variante gerne das mal mit nem array probieren..wie kann ich 50..68 in nem array fix deklarieren und hier anwenden als "i" ?

habt ihr nen tip?

Furtbichler 19. Mär 2014 21:24

AW: Array oder Integer?
 
Nee, die Funktion liefert genau einen HS, vermutlich den ersten. Kannst Du anhand des THotSpot nicht den Namen herausfinden und dann einfach alles mit gleichem Namen markieren?

rhodan 19. Mär 2014 21:34

AW: Array oder Integer?
 
ich dachte ich hätte genau das schon getan indem ich nach dem hotspotnamen gesucht habe...oder welche möglichkeit meinst du...mit rausfinden?

Sir Rufo 19. Mär 2014 21:37

AW: Array oder Integer?
 
Zitat:

Zitat von rhodan (Beitrag 1252625)
den namen holen? ich dachte das hätte ich mit
Code:
if hotspot = hsi.HotSpotByName('Kanada') then
begin
schon getan?

Wie soll das möglich sein?

Wenn die Funktion alle Hotspots zurückliefert die zu Kanada gehören, dann würde der Vergleich niemals passen (Ein Apfel ist immer ungleich einem Korb Äpfel). :roll:

Sir Rufo 19. Mär 2014 21:39

AW: Array oder Integer?
 
Zitat:

Zitat von rhodan (Beitrag 1252627)
ich dachte ich hätte genau das schon getan indem ich nach dem hotspotnamen gesucht habe...oder welche möglichkeit meinst du...mit rausfinden?

Delphi-Quellcode:
HotspotByName
liefert einen, einen einzigen, und zwar den ersten Hotspot der in der Liste steht und dem Namen Kanada zugeordnet ist!

Ich würde es gerne noch lauter schreiben, denn irgendwie rede ich mir hier den Mund fusselig (siehe meinen ersten Beitrag)

Popov 19. Mär 2014 21:50

AW: Array oder Integer?
 
@rhodan

Ich kenne die Komponente nicht, aber da muss es noch was anders geben.

Ich denke mal das ist so ähnlich wie bei TStringList.IndexOf(). Du kannst eine Liste erstellen in der du 10 mal "Kanada" stehen hast, aber IndexOf('Kanada') wird dir immer nur den ersten Wert liefern. Wenn du wissen willst ob in dem StringList "Kanada" noch öfters vorkommt, dann mußt du die ganze Liste manuell durchgehen.

Evtl. ist es da bei dir so ähnlich und du kannst über ein Item drauf zugreifen.

nuclearping 19. Mär 2014 21:52

AW: Array oder Integer?
 
Ah, jetzt hats bei mir auch Klick gemacht. Ich kannte die THotSpot-Komponente bis dato nicht. :D

Zitat:

Zitat von rhodan (Beitrag 1252625)
den namen holen? ich dachte das hätte ich mit
Code:
if hotspot = hsi.HotSpotByName('Kanada') then
begin
schon getan?

Das was Sir Rufo meint ist, dass der Parameter
Delphi-Quellcode:
HotSpot: THotSpot
aus dem Funktionsaufruf den Hotspot zurückliefert, den du gerade markiert hast.

Was du aber mit
Delphi-Quellcode:
hsi.HotSpotByName(...)
machst, ist zu prüfen, ob der markierte Hotspot dem Hotspot entspricht, den du als "Kanada" ALS ERSTES in die Liste aufgenommen hast. Das erklärt auch, warum es nur funktioniert, wenn du auf den HotSpot 50 gehst.

Der Wert von
Delphi-Quellcode:
Hotspot: THotSpot
als Parameter hat in dem Fall aber sicher eine andere ID / Speicheradresse (Instanz) als
Delphi-Quellcode:
hsi.HotSpotByName('Kanada')
.

Du schreibst auch, dass du jeden Kanada-Hotspot die ID "Kanada" gegeben hast. Das ist, wie sich jetzt zeigt, schlecht. Du solltest jedem Hotspot eine eindeutige ID geben, zB Kanada1, Kanada2, ...

Das was du machen musst ist (in einer Schleife) zu prüfen, ob der Parameter
Delphi-Quellcode:
Hotspot: THotSpot
mit irgendeinem (in dem Fall) "KanadaX"-Hotspot übereinstimmt und dann kannst du die restlichen dazugehörigen hervorheben.

Sir Rufo 19. Mär 2014 21:59

AW: Array oder Integer?
 
Also ich kenn die Komponente auch nicht, aber das müsste so funktionieren:
Delphi-Quellcode:
procedure Tworldmapsource.hsiHotSpotEnter(Sender: TObject; HotSpot: THotSpot);
var
 i : Integer;
begin
  for I := 0 to hsi.Count { oder HotspotCount ??? } - 1 do
    hsi.HotSpots[i].HERVORHEBEN := hsi.HotSpots[i].Name { ? } = HotSpot.Name { ? } ;
end;
Ob die Eigenschaften (
Delphi-Quellcode:
Count
,
Delphi-Quellcode:
Name
) jetzt so heißen kann ich nicht sagen, aber so einfach geht das idR.

EDIT
Jetzt ist es ein Zweizeiler geworden :)

rhodan 19. Mär 2014 22:22

AW: Array oder Integer?
 
das problem ist es wird bei
Code:
procedure Tworldmapsource.hsiHotSpotEnter
nur auf den EINEN hotspot zugegriffen auf dem ich gerade bin

Sir Rufo 19. Mär 2014 22:24

AW: Array oder Integer?
 
Zitat:

Zitat von rhodan (Beitrag 1252635)
das problem ist es wird bei
Code:
procedure Tworldmapsource.hsiHotSpotEnter
nur auf den EINEN hotspot zugegriffen auf dem ich gerade bin

Hast du meinen Codevorschlag schon ausprobiert? :roll:

nuclearping 19. Mär 2014 23:34

AW: Array oder Integer?
 
Zitat:

Zitat von rhodan (Beitrag 1252635)
das problem ist es wird bei
Code:
procedure Tworldmapsource.hsiHotSpotEnter
nur auf den EINEN hotspot zugegriffen auf dem ich gerade bin

Ja, und entsprechend musst du (wie in dem Beispiel von Sir Rufo) die ganze Liste der verfügbaren Hotspots durchsuchen, um zu schauen, ob du auf einem der Kanada-Hotspots bist.

rhodan 20. Mär 2014 06:06

AW: Array oder Integer?
 
huh tut mir leid den post hab ich gestern nicht gesehen, hab die seite wohl nicht aktualisiert. ich probiers heute nachmittag mal aus, danke!

rhodan 20. Mär 2014 18:08

AW: Array oder Integer?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sir Rufo (Beitrag 1252633)
Also ich kenn die Komponente auch nicht, aber das müsste so funktionieren:
Delphi-Quellcode:
procedure Tworldmapsource.hsiHotSpotEnter(Sender: TObject; HotSpot: THotSpot);
var
 i : Integer;
begin
  for I := 0 to hsi.Count { oder HotspotCount ??? } - 1 do
    hsi.HotSpots[i].HERVORHEBEN := hsi.HotSpots[i].Name { ? } = HotSpot.Name { ? } ;
end;
Ob die Eigenschaften (
Delphi-Quellcode:
Count
,
Delphi-Quellcode:
Name
) jetzt so heißen kann ich nicht sagen, aber so einfach geht das idR.

EDIT
Jetzt ist es ein Zweizeiler geworden :)


...wie der code einfach mal funktioniert..kaum macht mans richtig :lol::lol:
danke dir! wieder was dazugelernt! :-D :oops: :-D :-D
und danke fürs bart fusselig reden :D

ps: jep das ist kanada und nicht simbabwe i know, sind noch keine texte dafür drin ;D

Popov 20. Mär 2014 21:24

AW: Array oder Integer?
 
Nur interessehalber, wie funktioniert diese Komponente? Ich kenne ein Programm mit dem man Polygone zeichnen kann. Im Grunde sind sie dann nur Polygone und einfach nur ein Teil einer Grafik. Dann aber kann man sie mit einer Tabelle verknüpfen, und plötzlich kann man Regeln ausstellen. Polygone die bestimmte Regeln erfüllen (weil in Tabelle) kann man zählen, umfärben usw.

Was mich also interessiert ist, bietet die Komponente eigene Polygone an oder bietet sie nur die Möglichkeit sich an Polygone anzuheften?

Sir Rufo 20. Mär 2014 21:47

AW: Array oder Integer?
 
TMS THotspotImage
Da sollten fast alle Fragen beantworten -> Product Manual

rhodan 20. Mär 2014 23:11

AW: Array oder Integer?
 
im prinzip ist die komponente recht einfach gestrickt...

ich hab sie als teil des TMS component bundles 7.0 wo noch einige andere tolle dinge mit drin sind, kann ich nur empfehlen.

als erstes lädt man ein bild in das hotspotimage welches man benutzen möchte, dann macht man in delphi dort nen doppelklick drauf und es öffnet sich der hotspoteditor... nun kannst du entweder via rechteck, kreis oder "zauberstab" nen hotspot festlegen...zauberstab heisst hier wohin du klickst wird markiert anhand der grafischen grenzen..ich hab mir nun ne map gesucht wo schon viele länder vorher abgerenzt waren, das macht vieles einfacher diesbezüglich.

LEIDER kann man nicht wie in photoshop den zauberstab benutzen und dann per SHIFT oder so zu dem hotspot weitere teile hinzufügen die man anklickt..dann hätte mein problem nicht bestanden...insofern ist jeder klick ein eigener hotspot. dem kann man dann nach belieben ne eigene ID und namen zuweisen und festlegen wie genau sich der hotspot verhält wenn man mit der maus drüberfährt oder wenn man klickt ..ob er blinken soll oder nicht und wenn ja in welcher farbe etc...programmieren kann man dann eben was passiert wenn jemand drauf klickt oder mit der maus drüberfährt etc..man kann einfach individuell verschiedene bereiche im bild anklickbar machen und festlegen was in diesem fall passieren soll

lg


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 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