Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ClickEvent auf formen (nichts quadratisches) (https://www.delphipraxis.net/136887-clickevent-auf-formen-nichts-quadratisches.html)

Freiwilderer 9. Jul 2009 14:25


ClickEvent auf formen (nichts quadratisches)
 
Hallo,
ich weiß, der Titel ist etwas seltsam, aber das is vielleicht auch der grund, warum ich so noch nichts finden konnte für mein problem.
Und zwar möchte ich eine art Zeichnung programmieren, deren unterschiedliche objekte unterschiedliche Buttons darstellen sollen.
Die Buttons soll man aber nicht sehen und sie sollen nicht quadratisch sein ^^

Habe die Jedi komponenten durchforstet und zwei dinger gefunden, die in kombination genau das wären, was ich brauche, aber vielleicht gehts ja auch anders.

also ich will eigentlich im Grunde ein auto zeichnen, wenn ich auf die reifen klicke, soll es quietschen, wenn ich auf die motorhaube klicke soll es brummen (mal so als beispiel).

Die beiden komponente, die ich meine sind einmal
JvShapedButton, der zwar ein button, mit verschiedenen formen, aber trotzdem sehr beschränkt ist.
und
JvTransparentForm,
Bei dem dingen kann ich eine Maske hinterlegen und zwar ein bild, und danach wird die form dann "abgeschnitten"

Wenn es jetzt einen button mit der möglichkeit eine maske zu hinterlegen geben würde, wäre ich vollkommen zufrieden.

nunja,

ich hoffe mein problem ist einigermaßen gut rübergekommen und freue mich auf lösungsvorschläge.
wie gesagt, ich brauch nich unbedingt buttons, muss nur wissen, über welchem teil eines bildes ein click event stattfindet,

mfg

BrunoT 9. Jul 2009 15:48

Re: ClickEvent auf formen (nichts quadratisches)
 
Hallo Freiwilderer, :gruebel:

ein Lösungsansatz wäre folgender:

Auf Webseiten nennt man so etwas Maps, das sind Bilder, die in Bereiche zerlegt sind und so auf Maus-Events reagieren.

Mach doch die auswertbaren Bereiche klein genug und frage die zusammengehörigen Bereiche einer Form( z.B. Rad) ab.

Lege die Bereiche in Arrays ab, diese kann man dann schnell durchforsten, welcher getroffen wurde und zu welcher Form (Rad, Hupe)
er gehört.

Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     //auswerten
end;
mfg

Holger

Freiwilderer 9. Jul 2009 16:01

Re: ClickEvent auf formen (nichts quadratisches)
 
Hallo Bruno,
danke schonmal für die schnelle antwort
das ist genau das, was ich brauche ...
allerdings hatte ich irgendwie gehofft, dass das schöner geht
.. bis ich alle bereiche, die einen kreis bilden abgefragt hab, hab ich ja fast jedes pixel einzeln abgefragt.
Und ich muss grob geschetzt 100 bilder mit jeweils ca 50 einzelnen bereichen erzeugen,
evtl. wollte ich dafür auch einen editor schreiben und naja ... hatte halt einfach gehofft, dass es zB mit shapes geht


muss flux, weg, ich meld mich von zuhause nochmal an in ca 90 minuten bye

BrunoT 9. Jul 2009 16:15

Re: ClickEvent auf formen (nichts quadratisches)
 
Hallo Freiwilderer,

es gibt noch eine bessere Methode:

fertige von jedem Bild eine Kopie an. Die klickbaren Bereiche färbst du in der Kopie gleichmässig mit jeweils einer andern Farbe. wenn dann ein Klick auf das Original-Bild erfolgt, wertest du einfach die Kopie im Hintergrund aus, welche Farbe da ist. Die farbe erzählt dir, was für ein Bereich getroffen Wurde. Die Bilder verwaltest du in einer TImageList.

Das Erstellen der Bilder sollte recht einfach sein. die Abfrage auch. (und schnell)

Viel Spass beim Malen

mfg

Muetze1 9. Jul 2009 16:47

Re: ClickEvent auf formen (nichts quadratisches)
 
... oder Regions in einer Liste verwaltet und mit PtInRgn() einfach abfragen.

Freiwilderer 9. Jul 2009 17:41

Re: ClickEvent auf formen (nichts quadratisches)
 
hi, da bin ich wieder
die version klingt um einiges einfacher, und angenehmer, vor allem, wenn es um einen editor geht, das werd ich morgen sofort mal ausprobieren, danke :)

@Muetze1 ... die funktion kenne ich nicht, werd mich morgen aber auch mal reinlesen, vielen dank ebenfalls.

Freiwilderer 10. Jul 2009 08:19

Re: ClickEvent auf formen (nichts quadratisches)
 
hallo
also das mit den zwei bildern läuft
und ziemlich genau so, wie ich mir das vorgestellt hatte
...
doof is nur, dass mir grad was aufgefallen ist
nämlich würde ich eigentlich ganz gern, die stellen vom angezeigten bild, die schonmal angeklickt wurden kennzeichnen
... ich gebe zu, hab ich vorher nich drüber gesprochen, is mir auch gerade erst aufgefallen, dass das sinnvoll wäre ^^

... ich glaub, das schmeißt gerade die gesamte funktion wieder über den haufen ^^ ;)

ich hoffe auf eure geduld und auf ne gute Lösung für dieses neue problem

mfg

Draos 10. Jul 2009 08:48

Re: ClickEvent auf formen (nichts quadratisches)
 
also so wie ich das Bild verstand, ist der Button da wo nicht der Hintergrund ist. Gut es gibt ja mehr als 2 Farben, somit kannste die angeklickte Stelle sagen wir eine 3. Färbung verpassen. So kannst du 16^6 verschiedene Farben wählen für 16^6 Klicks auf die selbe Stelle

Sherlock 10. Jul 2009 08:49

Re: ClickEvent auf formen (nichts quadratisches)
 
Wieso? Du kannst Doch einfach auf den Canvas, an der Stelle wo geklickt wurde einen anders farbigen Punkt setzen. Schon ist es markiert.

Oder wie hast Du das jetzt gemeint?

Sherlock

Freiwilderer 10. Jul 2009 08:54

Re: ClickEvent auf formen (nichts quadratisches)
 
Hallo,
Danke schonmal für die Antworten zu so früher stunde.

Also Stellt euch die Bauzeichnung von einem Haus vor
Da gibts n dach, ne wand, n fenster und ne tür.

Dach = Rot,
Wand = Blau
Fenster = Grün
Tür = Gelb

darstellen möchte ich eine schwarz/weiß zeichnung
also habe ich eine zeichnung in schwarz/weiß und im Hintergrund ein farbiges haus, mit ausgefüllten flächen.
wenn ich jetzt auf die tür in der schwarz/weiß zeichnung klicke, kann ich die farbe gelb abfragen.
nun möchte ich aber, dass in dem moment, wo ich die tür anklicke, sie auch in der schwarz/weiß zeichnung gelb wird
oder schwarz, ... oder irgendwie anders halt.
aber nicht nur der einzeln angeklickte punkt, sondern die gesamte fläche.

ich hoffe, das ist nun verständlicher rübergekommen :)

Satty67 10. Jul 2009 09:12

Re: ClickEvent auf formen (nichts quadratisches)
 
Du weist ja welche Farbe im "bunten" Bild geklickt wurde, einfach das "bunte" Bild durchlaufen und immer wenn "geklickte Farbe", dann auf Schwarz/Weis Bild übertragen. Dazu würde ich das bunte Bild einfach am Anfang einmal in ein Array einlesen. Das ist dann schneller als ein TImage (bzw. weniger Denksport mit Scanlines)

Evtl. bietet Windows sogar ein maskiertes (mit der geklickten Farbe) kopieren des komplettes Bildes an.

Draos 10. Jul 2009 09:13

Re: ClickEvent auf formen (nichts quadratisches)
 
Schau dir mal Canvas.FloodFill() an. Die weiß ich gabs schon bei Delphi 6 und glaube auch 3.

Delphi-Quellcode:
 canvas.Brush.Color:=$FF0000;             //hier die neue Farbe für den Bereich hin.
 canvas.FloodFill(x,y,$0000FF,fsSurface);//Rot ist die alte Farbe, fsSurface sagt, dass die alte Farbe der Bereich ist

Freiwilderer 10. Jul 2009 09:36

Re: ClickEvent auf formen (nichts quadratisches)
 
moin,
das mit dem floodfill klingt schonmal gar nicht schlecht.
habe das jetzt so hier stehen:
Delphi-Quellcode:
procedure TfrmPlanung.Image2MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 image2.canvas.FloodFill(x,y,GetPixel(Image1.Canvas.Handle,x,y),fsBorder);
end;
allerdings macht er mir einfach nur die komplette fläche, in der das bild zu sehen war weiß
irgendwas passt da noch nich so richtig ;D

Draos 10. Jul 2009 09:45

Re: ClickEvent auf formen (nichts quadratisches)
 
Das Prob an FloodFill ist, dass es allerdings nur mit einen Canvas arbeitet. Sprich wenn du Image2.canvas nimmst zeichnet der auch darauf. Canvas.Brush ist die Farbe un nimm mal fsSurface als Konstante. Allerdings kannst du sagen wir mal so:

Delphi-Quellcode:
procedure TfrmPlanung.Image2MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var i,j    :Integer;
begin
 image2.canvas.Brush:=$123456;
 image2.canvas.FloodFill(x,y,clGreen,fsSurface);
 for i:= 0 to Image2.Width do
  for j:=0 to Image2.Height do
   if Image2.canvas.Pixels[i,j]=$123456 then
    Image1.Canvas.Pixels[i,j]:=clLime;
 Image2.canvas.Brush:=$clGreen;
 image2.Canvas.FloodFill(x,y,$123456,fsSurface);
end;
Er füllt die Fläche bei Image2 mit einer ganz bestimmten Farbe, zeichnet danach alle Pixels die bei Image2 die bestimmte Farbe haben bei Image1 farbig und setzt in Image2 die Farbe zum Schluß zurück.

Freiwilderer 10. Jul 2009 09:48

Re: ClickEvent auf formen (nichts quadratisches)
 
ach ja,
grundsätzlich wäre es mir am liebsten, wenn nur der rahmen, also die farbe schwarz
durch die andere farbe ersätzt wird.
bei dem fsBorder übermalt er mir, wie schon gesagt, das ganze bild, bei dem fsSurface macht er gar nichts

@Draos
Image1 ist das farbige bild im hintergrund, welches ich nicht verändern möchte
image2 ist das schwarz/weiß bild, bei dem ich im entsprechenden bereich schwarz durch eine andere farbe ersetzen möchte.

vielen dank für die mühen

Freiwilderer 10. Jul 2009 09:57

Re: ClickEvent auf formen (nichts quadratisches)
 
ha, jetzt gehts
ich poste nachher mal meine lösung, hab nur gedacht, nich, dass jemand jetzt noch stunden lang schreibt :)

vielen Dank draos, konnte mir aus deinem kram das zusammenbasteln, was ich gebraucht hab.

Freiwilderer 10. Jul 2009 10:21

Re: ClickEvent auf formen (nichts quadratisches)
 
so
also so läufts, so wie ich das gerne hätte,
zwar mit ner leichten verzögerung, aber da zwischendurch noch was anderes passieren wird, fällt das wohl kaum auf.
Delphi-Quellcode:
 for i := 0 to Image2.Width do
  for j := 0 to Image2.Height do
   if (Image2.Canvas.Pixels[i,j] = clBlack) and
      (Image1.Canvas.Pixels[i,j] = panel2.color)then
    Image2.Canvas.Pixels[i,j] := clAqua;

er sucht also den kompletten bereich ab, wenn der Bereich auf image2 schwarz ist
und auf image1 die farbe des angeklickten bereiches hat, überschreibt er das schwarz mit clAqua
so wird nur der Rand und nicht die komplette fläche mit einer neuen farbe versehen.

mfg
und nochmals vielen dank


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