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 Rechtecke auf TCanvas "verteilen" (https://www.delphipraxis.net/102982-rechtecke-auf-tcanvas-verteilen.html)

Thorben_Ko 7. Nov 2007 20:53


Rechtecke auf TCanvas "verteilen"
 
Hallo,

ich habe ein mehrer Objekte geschrieben die einfac hgesagt folgendes machen:

TField zeichnet einfach ein Rechteck auf ein TCanvas

TFarbFeld wurde von PaintBox vererbt und auf dem Canvas werden die Rechtecke gezeichnet.

Die grösse der einzelnen Rechtecke ist abhängig von der grösse der Painbox.

Die Höhe und die Breite die jedes einzelene Field haben muss rechne ich mit
Delphi-Quellcode:
hohe := Self.Height div fRowCount;
aus.

DAs probleme ist nun das er logischer weise (manchmal) einen rest bekommt. Dieser Rest wird micht befüllt. Ich möchste diesen Rest halbwegs gleichzeitig auf die Felder verteilen, um nicht am ende einen Bereich ganz "leer" zu lassen.Ich hab aber keine Idee wie ich das machen soll.

Hoffe jemand hat diesen Text verstanden und kann mir helfen

Thorben

Nikolas 7. Nov 2007 21:13

Re: Rechtecke auf TCanvas "verteilen"
 
Mach es doch so:

Rechne dir das hier aus :

real breite := gesamtbreite/anzahl. (ungerundet!)
Dann hat das n-re Rechteck seine linke Ecke bei round(n*breite) und die rechte bei round((n+1)*breite).

Das letzte (n=Anzahl-1) hat dann seine rechte ecke bei round((Anzahl -1 +1)+gesamtbreite/anzahl)) was auf ein Pixel genau deine Breite sein dürfte.

Wichtig ist einfach, dass du bei jedem Rechteck rundest und nicht schon am Anfang.

Thorben_Ko 7. Nov 2007 22:42

Re: Rechtecke auf TCanvas "verteilen"
 
Super vielen dank, so geht es

Aber leider folgt schon das nächste....

Bis jetzt konnte problemlos ermitteln welches Feld im OnMouseDown geclickt wurde. DA aber nun alle Felder "unterschiedliche" grössen haben, geht das leider nicht mehr so einfach...

Hast dazu auch ne Idee?

Danke schon mal falls noch was kommt, aber vorallem danke für deinen wirklich guten tipp

Gruss Thorben

Nikolas 8. Nov 2007 07:13

Re: Rechtecke auf TCanvas "verteilen"
 
Ich habe mir der Painbox noch nicht gearbeitet, weiss also auch nicht, ob sie ein eigenes Mouse-event hat, über das man gehen kann, aber auch ohne ist es nicht so schwer:

Sei x deine Mauskoordinate:
Dann rechnest du floor(Gesamtbreite/breite) und solltest deine Fläche gefunden haben. Alternativ könntest du auch eine Liste der Positionen benutzen. Wenn du die Rechtecke verlegst, merkst du dir die gerundeten Positionen der Kanten und wenn du jetzt einen Klick verarbeiten willst, gehst du da einfach mit einer Schleife durch.

Was mir grad noch auffällt, ist das immer zwei Kanten aufeinanderfallen. (rechts_(n)=links(n+1)
Das kannst du entweder ignorieren (wenn der Benutzer eben direkt auf die Kante klickt, ist er selbst Schuld, wenn er nicht genau weiss, was passiert), oder du verkleinerst eben die Breite der o.B.d.A linken Kachel ohne ihre linke Position zu ändern.

Also grob ein Vorschlag:

-> 2D array anlegen
Delphi-Quellcode:
for i:=0 to Anzahl-1 do
 list(i):= round(i*breite); // Koordinate der linken Ecke

Panel_i.left := list(i-1);
Panel_i.right := list(i-1+1)-1;
Width sollte klar sein.

Abfrage:
i:=0;
while x<list(i-1) do inc(i); // müsste so stimmen
Ungetestet, das Array kann man wahrscheinlich auch weglassen, wenn man alternativ über die Kacheln iteriert, aber das ist ja nur eine Skizze. Und da das array klein ist und du es nicht häufig durchlaufen wirst, kannst du dich einfach für die verständlichere Version oder die einfacher zu implementierende entscheiden.

Thorben_Ko 8. Nov 2007 13:38

Re: Rechtecke auf TCanvas "verteilen"
 
Dank deines Ansatzes hab ich es hin bekommen

danke dir

Nikolas 8. Nov 2007 17:34

Re: Rechtecke auf TCanvas "verteilen"
 
Wie hast du es denn jetzt implementiert? So ein Problem ist ja nicht allzu selten, da wäre es mal praktisch eine schöne Lösung irgendwo zu haben.

Thorben_Ko 8. Nov 2007 19:28

Re: Rechtecke auf TCanvas "verteilen"
 
Ich bin jedes Element durch gegangen und hab auf die Werte geprüft

Delphi-Quellcode:
    for x1 := 0 to fColCount - 1 do
    begin
      for y1 := 0 to fRowCount - 1 do
      begin
        if (Y > fItems[x1,y1].Top) and (Y < fItems[x1,y1].Height + fItems[x1,y1].Top) and
          (x > fItems[x1,y1].Left) and (X < fItems[x1,y1].Left + fItems[x1,y1].Width) then
        begin
          Field := fItems[x1,y1];
          found := True;
          Break;
        end;
      end;
      if found then
        Break;
    end;
Wobei:


Delphi-Quellcode:
  fItems : Array of array of TField;
TField zeichner einfach das Rechteck auf den Canvas.

Aber noch was anderes...

Ich dachte es wird kein probleme das die die elemente die selben "Aussenlienen" teilen, leide wurde es soeben doch eines...
Ich hab die Höhe und breite einfach um eins zu verkleinern, leider gab das nur ein durscheinander auf dem Canvas...

Hat jemand ne idee?


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