![]() |
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:
aus.
hohe := Self.Height div fRowCount;
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 |
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. |
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 |
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:
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.
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 |
Re: Rechtecke auf TCanvas "verteilen"
Dank deines Ansatzes hab ich es hin bekommen
danke dir |
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.
|
Re: Rechtecke auf TCanvas "verteilen"
Ich bin jedes Element durch gegangen und hab auf die Werte geprüft
Delphi-Quellcode:
Wobei:
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;
Delphi-Quellcode:
TField zeichner einfach das Rechteck auf den Canvas.
fItems : Array of array of TField;
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 01:37 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