AGB  ·  Datenschutz  ·  Impressum  







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

Rechtecke auf TCanvas "verteilen"

Ein Thema von Thorben_Ko · begonnen am 7. Nov 2007 · letzter Beitrag vom 8. Nov 2007
Antwort Antwort
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#1

Rechtecke auf TCanvas "verteilen"

  Alt 7. Nov 2007, 21:53
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
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
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Rechtecke auf TCanvas "verteilen"

  Alt 7. Nov 2007, 22:13
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#3

Re: Rechtecke auf TCanvas "verteilen"

  Alt 7. Nov 2007, 23:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Rechtecke auf TCanvas "verteilen"

  Alt 8. Nov 2007, 08:13
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#5

Re: Rechtecke auf TCanvas "verteilen"

  Alt 8. Nov 2007, 14:38
Dank deines Ansatzes hab ich es hin bekommen

danke dir
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Rechtecke auf TCanvas "verteilen"

  Alt 8. Nov 2007, 18:34
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#7

Re: Rechtecke auf TCanvas "verteilen"

  Alt 8. Nov 2007, 20:28
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:


  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?
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:30 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