Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:43

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Sa Aug 02, 2008 21:18 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Hallo,
ich habe vor einiger Zeit angefangen die Idee der eigenen Scrollbox die ich hier beschrieben habe:
viewtopic.php?t=7669
auch um zu setzten. Nach meinen erstauen habe ich das auch ganz gut hinbekommen.

Es gibt nur noch einen hacken: Es werden alle Objekte gezeichnet, auch die Objekte die gar nicht im Sichtbereich sind.
Ich habe zwei Ziele: Zum ersten, soll die Scrollbox nur die Objekte zeichnen die der User auch wirklich sieht zum Zweiten sollen die Objekte selbst nur den Teil von sich zeichnen die auch Sichtbar sind. Dadruch erhoffe ich mir CPU-Last zu sparen.

Ich habe ein Text Objekt um Text dazustellen, ein Image Objekt um Bilder dazustellen.

Hier mal etwas code für euch:

So Zeichne ich die Objekte. Die Objekte werden einfach nur verschoben. z.b. in den Nichtsichtbereich.
Dadurch entsteht der Effekt, das gescrollt wird:
Code:
  1.  
  2. procedure TPLScrollBox.Paint;
  3. var
  4.   i,m,py:Integer;
  5. begin
  6.   inherited Paint;
  7.   BMPSetSize(buffer,Width,Height);
  8.   buffer.Canvas.FillRect(0,0,Width,Height);
  9.   for i:=0 to fItems.Count-1 do begin
  10.     items[i].PaintX:=items[i].Left-ScrollX;
  11.     items[i].PaintY:=items[i].Top-Scrolly;
  12.    
  13.     if abs(items[i].PaintY-ClientHeight) <=ClientHeight then begin
  14.       items[i].PaintWidth:=abs(ClientWidth-items[i].PaintX);
  15.       items[i].PaintHeight:=abs(ClientHeight-items[i].PaintY);
  16.       items[i].Paint;
  17.     end;
  18.   end; // for i
  19.   Canvas.Draw(0,0,buffer);
  20. //  sleep(100);
  21. end; // TPLScrollBox.Paint
  22.  

Die Variablen ScrolLX und ScrolLY werden hier gesetzt:
Code:
  1.  
  2. procedure TPLScrollBox.ScrollVerti(const aScrollCode: SmallInt);
  3. begin
  4.   case aScrollCode of
  5.     SB_TOP: Scrolly:=0;
  6.     SB_BOTTOM: Scrolly:=SV.nMax;
  7.     SB_LINEDOWN: begin
  8.       if Scrolly+20 < sV.nMax-ClientHeight then Scrolly:=Scrolly+20 else scrollY:=sV.nMax-ClientHeight;
  9.         Scrolly:=Scrolly+20;
  10.  
  11.     end; // SB_LINEDOWN
  12.  
  13.     SB_LINEUP: begin
  14.       if Scrolly-20 >=0 then Scrolly:=Scrolly-20 else scrollY:=0;
  15.     end; // SB_LINEUP
  16.  
  17.     SB_PAGEDOWN: begin
  18.       if Scrolly+(ClientHeight div 2) <=sv.nMax then Scrolly:=Scrolly+(ClientHeight div 2) else scrollY:=SV.nMax;
  19.  
  20.     end; // SB_PAGEDOWN
  21.  
  22.     SB_PAGEUP: begin
  23.  
  24.       if Scrolly-(ClientHeight div 2) >=0 then Scrolly:=Scrolly-(ClientHeight div 2) else scrollY:=0;
  25.     end; // SB_PAGEUP
  26.  
  27.     SB_THUMBTRACK,SB_THUMBPOSITION: begin
  28.       SV.cbSize := SizeOf(SV);
  29.       SV.fMask := SIF_TRACKPOS;
  30.       GetScrollInfo(Handle, SB_Vert, SV);
  31.       Scrolly:= SV.nTrackPos;
  32.     end
  33.     else
  34.       exit;
  35.   end; // Of Case
  36.  
  37.   SetupScrollBars;
  38.   Refresh;
  39. end; // TPLScrollBox.ScrollVerti
  40.  
  41. procedure TPLScrollBox.ScrollHori(const aScrollCode: SmallInt);
  42. begin
  43.   Case aScrollCode of
  44.     SB_TOP: Scrollx:=0;
  45.     SB_BOTTOM: ScrollX:=ClientHeight;
  46.     SB_LINELEFT: begin
  47.       if ScrollX-20 >=0 then ScrollX:=ScrollX-20 else ScrollX:=0;
  48.     end; // SB_LINELEFT
  49.  
  50.     SB_LINERIGHT: begin
  51.       if ScrollX+20 <sh.nMax-ClientWidth then ScrollX:=ScrollX+20 else ScrollX:=sh.nMax-ClientWidth;
  52.     end; // SB_LINERIGHT
  53.  
  54.     SB_PAGELEFT: begin
  55.       if ScrollX-(ClientWidth div 2) >=0 then ScrollX:=ScrollX-(ClientWidth div 2) else ScrollX:=0;
  56.     end; // SB_PAGELEFT
  57.  
  58.     SB_PAGERIGHT: begin
  59.       if ScrollX+(ClientWidth div 2) <=SH.nMax then ScrollX:=ScrollX+(ClientWidth div 2) else ScrollX:=SH.nMax;
  60.     end; // SB_PAGERIGHT
  61.  
  62.     SB_THUMBTRACK,SB_THUMBPOSITION: begin
  63.       SH.cbSize := SizeOf(SH);
  64.       SH.fMask := SIF_TRACKPOS;
  65.       GetScrollInfo(Handle, SB_Horz, SH);
  66.       Scrollx:=SH.nTrackPos;
  67.     end
  68.     else
  69.       exit;
  70.    end; // Of Case
  71.   SetupScrollBars;
  72.   Refresh;
  73. end; // TPLScrollBox.ScrollHori  
  74.  

Die Methoden: ScrollHori und ScrollVerti werden einmal bei KeyDown und einmal hier aufgerufen:
Code:
  1.  
  2. procedure TPLScrollBox.WMVScroll(var Message: TWMVScroll);
  3. begin
  4.   inherited;
  5.   ScrollVerti(Message.ScrollCode);
  6. end; // TPLScrollBox.WMVScroll
  7.  
  8. procedure TPLScrollBox.WMHScroll(var Message: TWMHScroll);
  9. begin
  10.   inherited;
  11.   ScrollHori(Message.ScrollCode);
  12. end; // TPLScrollBox.WMHScroll
  13.  

Um den Maximalen bereich zu ermitteln, suche ich mir einmal das weit entfernteste Objekt in Y und in X Richtung rauß:
Code:
  1.  
  2. function TPLScrollBox.GetYremotelTop: Integer;
  3. var
  4.   i,z:Integer;
  5. begin
  6.   z:=0;
  7.   for i:=0 to fItems.Count-1 do begin
  8.     if items[i].top+items[i].Height >=z then z:=items[i].top+items[i].Height;
  9.   end; // for i
  10.   result:=z;
  11. end; // TPLScrollBox.GetYremotelTop
  12.  
  13. function TPLScrollBox.GetXHigh: Integer;
  14. var
  15.   i,z:Integer;
  16. begin
  17.   z:=0;
  18.   for i:=0 to fItems.Count-1 do begin
  19.     if items[i].Left+items[i].Width >=z then z:=items[i].Left+items[i].Width;
  20.   end; // for i
  21.   result:=z;
  22. end; // TPLScrollBox.GetXHigh
  23.  

Die SetupScrollBalken Methode sieht so aus:
Code:
  1.  
  2. procedure TPLScrollBox.SetupScrollBars;
  3. begin
  4.   if (HandleAllocated) then begin
  5.     ScrollH:=ClientHeight;
  6.  
  7.     SV.cbSize := SizeOf(SV);
  8.     SV.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL ;
  9.     SV.nPos := Scrolly;
  10.     SV.nMin := 0;
  11.     SV.nMax := GetYremotelTop;
  12.     SV.nPage:= ClientHeight;
  13.     SetScrollInfo(Handle, SB_Vert, SV, true);
  14.  
  15.     SH.cbSize := SizeOf(SH);
  16.     SH.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
  17.     SH.nPos := ScrollX;
  18.     SH.nMin := 0;
  19.     SH.nMax := GetXHigh;
  20.     SH.nPage:= ClientWidth;
  21.     SetScrollInfo(Handle, SB_Horz, SH, true);
  22.   end;
  23. end; // TPLScrollBox.SetupScrollBars  
  24.  

Zum Schluss hier noch mal der Code für das Zeichnen, des Text Objektes, ich habe noch mehr Objekte, aber das hier sollte reichen, wenn nicht beschreibe ich auch noch die anderen Objekte:
Code:
  1.  
  2. procedure TPLScrollBoxObjText.Paint;
  3. var
  4.   i,px,py:Integer;
  5. begin
  6.   inherited Paint;
  7.   py:=2; px:=2;
  8.   Buffer2.Canvas.Rectangle(0,0,Width,Height);
  9.   for i:=0 to fLines.Count-1 do begin
  10.       Buffer2.Canvas.TextOut(px,py,fLines[i]);
  11.  
  12.     py:=py+Buffer2.Canvas.TextHeight(fLines[i])+3;
  13.     if py >=PaintHeight then break;
  14.   end; // for i
  15.  
  16.   BitBlt(parent.buffer.Canvas.Handle,
  17.          Paintx, PaintY, PaintWidth,PaintHeight,
  18.          Buffer2.Canvas.Handle,0,0,SRCCOPY
  19.         );
  20. end; // TPLScrollBoxObjText.Paint
  21.  


Ich hoffe die Beschreibungen und die Einzelnen Code-Stücke helfen euch eine Lösung für mich zu finden. Das währe richtig Toll.
Ich sehe diese Scrollbox als Grundlage für viele viele Weitere Komponenten. Z.B. Währe es für mich ein leichtest diese Komponenten zu erstellen:
ListBox, ListView, TreeView, Memo, RichEdit, Edit, MainMenu, PopupMenu
mit HIlfe dieser ScrollBox.

Weil das Scrollen wahr für mich immer ein Problem. Und mit Hilfe meiner ScrollBox hoffe ich einfach, das Problem für mich und evlt. für andere ein für alle mal zu beseitigen.
Auf anfrage lade ich auch das ganze Projekt hier hoch. So groß ist das auch nicht. Wie ihr ja anhand der Code-Stücke sehen solltet.

Ich habe viel vor mit der ScrollBox ! :D Ob ich das auch alles Schaffe steht auf ein andere Blatt :)

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 02, 2008 23:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde einfach eine einfache Rechtecksprüfung machen: Du nimmst dir ersteinmal das "Sichtfenster". Das heißt, du brauchst die Koordinate, die bei dir oben links ist. Ungescrollt ist die (0|0), wenn du scrollst sollte sich das entsprechend ändern. Dann musst du nurnoch die breite und die höhe deiner Scrollbox haben, abzüglich der Scrollbars. Damit kennst du schonmal den Bereich, der sichtbar sein wird.

Nun prüfst du für jedes Element, ob sein Rechteck (definiert anhand seiner relativen Position und seiner Ausmaße), in dem Rechteck des Sichtfensters liegt. Ist das so, zeichnest du, ansonsten überspringst du dieses Element.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Danke für den Vorschlag. Die Idee hatte ich schonmal ausprobiert. Ich weiß nicht genau von wo ich aussehen soll.
Denn ScrolLX und ScrollY können auch negative werte Enhalten.

könntest du evlt. ein kleines Beispiel erstellen ? wie du dir das mit der Recheckes Prüfung vorstellst ?
Im Prinzip weiß ich das, aber mir fehlen die Daten Dazu. Ich dachte einfach ich könnte von ScrollX und ScrollY aussgehen + ClientW und ClientH. Aber das geht ausirgendeinen Grund nicht. Weil die Objekte dann nicht mehr richtig "gescrollt" werden. Aber so hattest du dir das auch vorgestellt oder ?

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 14:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Da ich jetzt zu Faul bin, mich durch deinen Code zu wühlen, mach ich ne Skizze. Könnte ne zeit dauern, ich hänge sie dann hier an.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Vielen Dank !

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 14:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
So, hier die Skizze.
Wenn du noch fragen hast, frag. Ich hoffe aber, dass sie einigermaßen klar ist.

//Edit: Negative Werte sollten überhaupt kein Problem darstellen.

Gruß Lord Horazont


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Danke für deine Skizze. Leider komme ich aber trotzdem nicht weiter:
Code:
  1.  
  2. procedure TPLScrollBox.Paint;
  3. var
  4.   i,m,py:Integer;
  5.   r,r1,r2:TRect;
  6. begin
  7.   inherited Paint;
  8.   BMPSetSize(buffer,Width,Height);
  9.   buffer.Canvas.FillRect(0,0,Width,Height);
  10.   r1.Left:=Scrollx;
  11.   r1.Top:=ScrollY;
  12.   r1.Right:=r1.Left+ClientWidth;
  13.   r1.Bottom:=r1.Top+ClientHeight;
  14.  
  15.   for i:=0 to fItems.Count-1 do begin
  16.     items[i].PaintX:=items[i].Left-ScrollX;
  17.     items[i].PaintY:=items[i].Top-Scrolly;
  18.     items[i].PaintWidth:=abs(ClientWidth-items[i].PaintX);
  19.     items[i].PaintHeight:=abs(ClientHeight-items[i].PaintY);
  20.  
  21.     r2.Left:=items[i].PaintX;
  22.     r2.Top:=items[i].PaintY;
  23.     r2.Right:=r2.Left+items[i].Width;
  24.     r2.Bottom:=r2.Top+items[i].Height;
  25.  
  26.     if IntersectRect(r,r1,r2) then begin
  27.       items[i].Paint;
  28.     end;
  29.   end; // for i
  30.   Canvas.Draw(0,0,buffer);
  31. end; // TPLScrollBox.Paint
  32.  


Aus irgendeinengrund ist jetzt das Scroll Verhalten Falsch. Einige Objekte werden einfach bei 0,0 gezeichnet, wobei die eigentlich ganz anders gezeichnet werden sollen.
Im Anhang findest du zwei Bilder. Das ScrollBox1 Zeigt das Falsche Bild. So soll es nicht aussehn. Das ist jetzt mit der Überprüfung.

Das ScrollBox2 Bild zeigt wie es richtig aussieht ohne Überprüfung !


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was ist r?
Du hast es deklariert, du übergibst es an IntersectRect, aber du füllst es nicht mit werten.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Das wird verlangt von IntersectRect. Der erste Parameter ist ein Var. Also wird r. von IntersectRect gesetzt.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 15:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was passiert denn, wenn du nur die Zeile mit dem If auskommentierst? Wie sah dein Code aus, bevor du ihn so umgebaut hast?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Dann wird alles richtig gezeichnet:
Code:
  1.  
  2. procedure TPLScrollBox.Paint;
  3. var
  4.   i,m,py:Integer;
  5.   r,r1,r2:TRect;
  6. begin
  7.   inherited Paint;
  8.   BMPSetSize(buffer,Width,Height);
  9.   buffer.Canvas.FillRect(0,0,Width,Height);
  10.   r1.Left:=Scrollx;
  11.   r1.Top:=ScrollY;
  12.   r1.Right:=(r1.Left+ClientWidth);
  13.   r1.Bottom:=(r1.Top+ClientHeight);
  14. //  r:=r1;
  15.   for i:=0 to fItems.Count-1 do begin
  16.     r2.Left:=items[i].Left;
  17.     r2.Top:=items[i].Top;
  18.     r2.Right:=r2.Left+items[i].Width;
  19.     r2.Bottom:=r2.Top+items[i].Height;
  20.     items[i].PaintWidth:=abs(ClientWidth-items[i].PaintX);
  21.     items[i].PaintHeight:=abs(ClientHeight-items[i].PaintY);
  22.  
  23. //    if IntersectRect(r,r1,r2) then begin
  24.       items[i].PaintX:=items[i].Left-ScrollX;
  25.       items[i].PaintY:=items[i].Top-Scrolly;
  26.  
  27.       items[i].Paint;
  28. //    end;
  29.   end; // for i
  30.   Canvas.Draw(0,0,buffer);
  31. //  sleep(100);
  32. end; // TPLScrollBox.Paint  
  33.  

Ich brauche wie du siehst nur die if Zeile auszukommentieren. Dann geht es prima. Allerdings werden jetzt auch alle Objekte gezeichnet. Was ich ja nicht möchte.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 16:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, da ist noch ein ganz relevanter Unterschied. Du setzt PaintX und PaintY erst nach PaintWidth und PaintHeight, das heißt, PaintWidth und PaintHeight basieren dann auf falschen Daten.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 16:41 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Jetzt habe ich es so, immer noch der Selber Fehler wenn wenn die IF Anweisung drin ist. Das letzte Objekt wird über dem Ersten gezeichnet.
Warum auch immer. Das Letzte Objekt soll ja nur gezeichnet werden, wenn ich auch wirklich dahin gescrollt bin und nicht früher !
Code:
  1.  
  2. procedure TPLScrollBox.Paint;
  3. var
  4.   i,m,py:Integer;
  5.   r,r1,r2:TRect;
  6. begin
  7.   inherited Paint;
  8.   BMPSetSize(buffer,Width,Height);
  9.   buffer.Canvas.FillRect(0,0,Width,Height);
  10.   r1.Left:=Scrollx;
  11.   r1.Top:=ScrollY;
  12.   r1.Right:=(r1.Left+ClientWidth);
  13.   r1.Bottom:=(r1.Top+ClientHeight);
  14. //  r:=r1;
  15.   for i:=0 to fItems.Count-1 do begin
  16.     r2.Left:=items[i].Left;
  17.     r2.Top:=items[i].Top;
  18.     r2.Right:=r2.Left+items[i].Width;
  19.     r2.Bottom:=r2.Top+items[i].Height;
  20.     if IntersectRect(r,r1,r2) then begin
  21.       items[i].PaintX:=items[i].Left-ScrollX;
  22.       items[i].PaintY:=items[i].Top-Scrolly;
  23.       items[i].PaintWidth:=abs(ClientWidth-items[i].PaintX);
  24.       items[i].PaintHeight:=abs(ClientHeight-items[i].PaintY);
  25.  
  26.       items[i].Paint;
  27.     end;
  28.   end; // for i
  29.   Canvas.Draw(0,0,buffer);
  30. //  sleep(100);
  31. end; // TPLScrollBox.Paint  
  32.  

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
habe die Ursache gefunden, es liegt nicht an der Paint methode sondern an den Objekten. Die auch eine Paint Methode haben wie:
Code:
  1.  
  2.   //  TextObj1.Paint;
  3.     TextObj1.scrollbox.SetupScrollBars;
  4. //    TextObj1.scrollbox.Refresh;
  5.  
  6. //    TextObj2.Paint;
  7.     TextObj2.scrollbox.SetupScrollBars;
  8.   //  TextObj2.scrollbox.Refresh;
  9.  
  10.   //  TextObj3.Paint;
  11.    // TextObj3.scrollbox.SetupScrollBars;
  12. //    TextObj3.scrollbox.Refresh;
  13.  
  14. //    TextObj4.Paint;
  15.     TextObj4.scrollbox.SetupScrollBars;
  16.   //  TextObj4.scrollbox.Refresh;
  17.  

Damit ich unterschiedliche Scroll Bereiche unterstützen kann, verwende ich meine eigene ScrollBox dafür.
Ich denke der Fehler liegt hier begraben.

edit: jetzt müsste ich wissen, ob das Objekt gezeichnet werden soll oder nicht und zwar im jeweiligen Objekt. falst die Paint Methode einzeln aufgerufen wird. Was aber nur bei einem Object im Moment sin macht.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 03, 2008 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habe auch einen Fehler in meiner Skizze. Das Rechteck der Komponenten muss nicht unter einbeziehung von ScrollX und ScrollY berechnet werden, das war Quatsch. Weiss garnihct, wie ich drauf gekommen bin.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 15 Queries | GZIP : On ]