![]() |
Eigene listbox mit TObjeklist Scroll problem
Hallo,
ich habe gestern angefangen eine eigene listbox zu schreiben mit TCanvas. Jetzt habe ich ein problem mit dem scrollen, hier der code:
Delphi-Quellcode:
procedure Tmylistbox.Draw;
var i:Integer; s:Char; y:Integer; begin HeaderCaption.DrawCaption('',-1,-1); FootCaption.DrawCaption(IntTostr(itemIndex)+'\'+IntTostr(Items.count) ,-1,-1); Paint.DrawRect(posX,posY,200,150); s:=#0; y:=-1; if items <> NIL then begin for i:=0 to items.count-1 do begin with TmyListItem(Items.Items[i]) do begin if Caption.isSel = True then begin s:='*'; SetIndex(i); FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count)+'\' + IntTostr(displaycount) ; end else begin s:=' '; SetIndex(-1); end; if (items.count-1 > displaycount) and (ScrollIndex > 0) and (Caption.fPos.y >displayh) then begin if Caption.fPos.y > posY+displayh then y:=(posy+Caption.fPos.y)-(posY+displayh) else y:=-1; if y <= 200 then Caption.DrawCaption(s,-1,y); end else begin if (items.count-1 <= displaycount) or (scrollindex = 0) then if i <=displaycount then Caption.DrawCaption(s,-1,-1); end; end; end; end; FootCaption.DrawCaption('' ,-1,-1); // FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count); end; displaycount = Anzahl der angezeigten items DisplayH = die Fläche in der angezeigt werden kann(die vertikale fläche) posx, posy:= listbox position das problem ist jetzt: es wird zwar richtig gezeichnet nur ich weiß noch nicht so recht wie ich es stuern kann, also ich möchte das scrollen beinflussen und genau das ist das problem: einmal möchte ich über einen scrollbalken und einmal über den itemIndex. kann mir jemmand tipps geben wie das gehen könnte? |
Re: Eigene listbox mit TObjeklist Scroll problem
weiß keiner eine lösung für dieses problem ?
|
Re: Eigene listbox mit TObjeklist Scroll problem
Dein Code ist mir zu unübersichtlich ich kann dir aber sagen wie es allgemein geht.
Das wesentliche ist, das man eine Variable hat in der der erste Sichtbare eintrag gespeichert wird. zeichnen:
Delphi-Quellcode:
Scrollen mit dreisatz:
YAnzeigePosition := 2;
for i:=indexdeserstensichtbarenEintrags to (Liste.Count-1) do begin Canvas.TextOut(2,YAnzeigePosition,Liste.Items[i].AnzeigeName); YAnzeigePosition := YAnzeigePosition + itemhoehe; if YAnzeigeposition > height then break; end; //Scrollbalken: positiondesscrollbalkens.y := ((ermittleheightfuerScrollen) *indexdeserstensichtbarenEintrags) div (Liste.count-(height div itemhoehe)); Canvas.Draw(positiondesscrollbalkens.x, positiondesscrollbalkens.y, Bilddesscrollbalkens);
Delphi-Quellcode:
y = Position des Mauszeigers (mousemove)
indexdeserstensichtbarenEintrags := ((Liste.Count-(height div itemhoehe)) * y) div ermittleheightfuerScrollen;
ermittleheightfuerScrollen = Scrollbereich in Pixeln (der Scollbalken geht ja nicht über die gesamte höhe der Komponnete) zum itemindex scrollen:
Delphi-Quellcode:
Es sind noch einige Sicherheitsabrafen notwendig, die ich wegen der Übersichtlichkeit weggelassen habe, aber im wesentlichen war es das.
indexdeserstensichtbarenEintrags := itemIndex;
|
Re: Eigene listbox mit TObjeklist Scroll problem
vielen dank für deine schnelle antwort. leider verstehe ich das beispiel nicht so ganz:
ich habe ihn versuch einzubauen:
Delphi-Quellcode:
im moment bin ich am überlegen wo ich indexdeserstensichtbarenEintrags ermitteln sollte
procedure Tmylistbox.Draw;
var i:Integer; s:Char; y,selY,indexdeserstensichtbarenEintrags:Integer; begin HeaderCaption.DrawCaption('',-1,-1); FootCaption.DrawCaption(IntTostr(itemIndex)+'\'+IntTostr(Items.count) ,-1,-1); Paint.DrawRect(posX,posY,200,150); s:=#0; y:=-1; if items <> NIL then begin for i:=indexdeserstensichtbarenEintrags to items.count-1 do begin with TmyListItem(Items.Items[i]) do begin if Caption.isSel = True then begin s:='*'; SetIndex(i); FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count)+'\' + IntTostr(displaycount) ; sely:=Tmylistitem(items.items[itemindex]).Caption.fpos.y-displayh end else begin s:=' '; SetIndex(-1); end; indexdeserstensichtbarenEintrags := ((items.Count-(displayh div 20)) * caption.fpos.y) div 20; Caption.DrawCaption(s,0,); end; end; end; FootCaption.DrawCaption('' ,-1,-1); // FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count); end; und was ist YAnzeigePosition ? |
Re: Eigene listbox mit TObjeklist Scroll problem
Jetzt gehts vielen dank für deine hilfe !
Delphi-Quellcode:
edit: es gibt da noch einen scrollfehler: wenn ich am letzten item bin verschwinden alle items ich hätte es aber gerne das die lezten-paar noch sichtbar sind
procedure Tmylistbox.Draw;
var i:Integer; s:Char; y,selY,indexdeserstensichtbarenEintrags,YAnzeigePosition :Integer; begin HeaderCaption.DrawCaption('',-1,-1); FootCaption.DrawCaption(IntTostr(itemIndex)+'\'+IntTostr(Items.count) ,-1,-1); Paint.DrawRect(posX,posY,200,150); s:=#0; y:=-1; if items <> NIL then begin YAnzeigePosition:=2; if itemindex = -1 then itemindex:=0; for i:=itemindex to items.count-1 do begin with TmyListItem(Items.Items[i]) do begin if Caption.isSel = True then begin s:='*'; SetIndex(i); FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count)+'\' + IntTostr(displaycount) ; sely:=Tmylistitem(items.items[itemindex]).Caption.fpos.y-displayh end else begin s:=' '; SetIndex(-1); end; // indexdeserstensichtbarenEintrags := ((items.Count-(displayh div 20)) * caption.fpos.y) div 20; Caption.DrawCaption(s,0,YAnzeigePosition); YAnzeigePosition:=YAnzeigePosition+20; if YAnzeigeposition > displayH then break; end; end; end; FootCaption.DrawCaption('' ,-1,-1); // FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count); end; |
Re: Eigene listbox mit TObjeklist Scroll problem
das problem wird sein wie ich die itemIndex ermittelte.
Ich suche nur in einer forschleife den index ermittel und die einzeln klassen ermitteln ob da einer makiert ist oder nicht... und das wird das problem sein denke ich mal das der index beim zeichnen nicht bekannt ist ! |
Re: Eigene listbox mit TObjeklist Scroll problem
Liste der Anhänge anzeigen (Anzahl: 1)
ich lade mal das progamm hoch... ich weiß einfach nicht mehr weiter :(
Delphi-Quellcode:
procedure Tmylistbox.Draw;
var i:Integer; s:Char; y,selY,indexdeserstensichtbarenEintrags :Integer; begin HeaderCaption.DrawCaption('',-1,-1); FootCaption.DrawCaption(IntTostr(itemIndex)+'\'+IntTostr(Items.count) ,-1,-1); Paint.DrawRect(posX,posY,200,150); s:=#0; y:=-1; if items <> NIL then begin // YAnzeigePosition:=0; // if itemindex = -1 then itemindex:=0; for i:=0 to items.count-1 do begin with TmyListItem(Items.Items[i]) do begin s:=' '; SetIndex(-1); if Caption.isSel = True then begin s:='*'; SetIndex(i); itemindex:=i; FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count)+'\' + IntTostr(displaycount) ; break; end; if i <= displaycount then TmyListItem(Items.Items[i]).Caption.DrawCaption(s,0,Caption.fpos.y); end; end; // else begin // s:=' '; // SetIndex(-1); // end; // indexdeserstensichtbarenEintrags := ((items.Count-(displayh div 20)) * caption.fpos.y) div 20; if itemindex >-1 then begin for i:=0 to items.count-1 do begin if (YAnzeigeposition <= (posy+displayH)-20) then begin if i = itemindex then s:='*' else s:=' '; TmyListItem(Items.Items[i]).Caption.DrawCaption(s,0,posy+YAnzeigePosition); if YAnzeigePosition + 20 < displayH-20 then YAnzeigePosition:=YAnzeigePosition+20 // else // YAnzeigePosition:=0; end; end; end; end; FootCaption.DrawCaption('' ,-1,-1); // FootCaption.fCaption:='Einträge: ' + IntTostr(itemIndex)+'\'+IntTostr(Items.count); end; |
Re: Eigene listbox mit TObjeklist Scroll problem
habs geschaft nach reichlicher überlegung bin ich zur einer lösung gekommen:
ich weiß ja wie viele items im sichtbereich sind, ich habe meine liste mit objekten und jetzt habe ich einen gruppenindex und das ist das entscheidene wenn in meinen fall kann ich 6 items sehen, wenn ich da jetzt z.b. 0 hinschreibe sehe ich dank der forschleife nur die 0-6 items wenn ich da 6 hinschreibe sehe ich nur von 6-12 und soweiter problem ist im moment noch mit angefangen seiten das muss ich noch mitberücksichtigen aber ich denke der weg ist klar. vielen dank für den tip mit dynamischen y positionen. hier der qullcode(nur das wesetnliche)
Delphi-Quellcode:
procedure Tmylistbox.Draw;
var i,y:Integer; s:String; begin // gruppencount:=Round((items.Count-1)/20); y:=0; for i:=gruppenindex to gruppenindex+displaycount do begin s:=''; with TmyListItem(items.items[i]).Caption do begin if isSel = true then s:='*'; DrawCaption(s,0,posy+y); inc(y,20); end; end; end; |
Re: Eigene listbox mit TObjeklist Scroll problem
ich weiß der beitrag ist schon etwas älter aber, erst jetzt habe ich alles hinbekommen wie es sollte bis auf eins und zwar das nur wenn ich drüke der balken mit der maus verschoben wird...
das hauptproblem ist warscheinlich das ich nur mit windows nachrichten arbeite also nicht onMouseMouse oder so sondern WM_MOUSEMOUVE das problem ist jetzt einfach der balken soll nur verschoben werden wen ich klick und ich dachte das könnte so funktionieren:
Delphi-Quellcode:
die funktion GetSel funktioniert !!! dort ist folgender code:
case message.msg of
WM_MOUSEMOVE: begin GetKeyboardState(Keyboard); Shift := KeyboardStateToShiftState(Keyboard); mx:=( Message.lParam and $FFFF); mY:=((Message.lParam shr 16) and $FFFF); // mY:=mY-posy; issel:=ScrollBL.GetSel(mx,my); if (ssleft in shift) and (issel = True) then begin issel:=True; mY:=mY-posy; m:=0; if ry - sh >=0then m:=sh; index1:=((items.Count-displaycount) * my) div ry-m; // if index1 = -1 then index1:=0; if (index1 >=0) and (index1+getm<=items.count-1) then Gruppenindex:=index1; draw; end [delphi] function TMycaption.GetSel(x,y:Integer):boolean; var px,py:Integer; begin if self <> NIL then begin // if x > -1 then // px:=x // else px:=fpos.x; // if y > -1 then // py:=y // else py:=fpos.y; issel:=PtInRect(Rect(px,py, px+fsize.x,py+fsize.y),Point(x,y)); result:=isSel; end; end; // getSel /delphi] das scrollen geht inzwischen prima mit mit gedrückter maustaste und auch per tastertur.... (Nochmals vielen dank für dein tip mit dem scrollen: Gandalfus) seit taten probiere ich es hinzubekommen !! |
Re: Eigene listbox mit TObjeklist Scroll problem
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin dabei mir eine kleine GUI selbst zu basteln. Im Anhang ist das neuste Bild.
Jetzt das Problem: Das Problem ist wieder beim Scrollen. Ich habe das jetzt anders gemacht, ich bewege im hintergrund ein ScrollRect von Typ TRect. Was mir ein Bildausschnitt aus einer TBitMap per BitBtl(unter Lazarus geht CopyRect leider nicht, nur unter Windows und ich arbeitet unter Linux) kopiert. Ich kann jetzt zwar mit der Maus schön in X und in Y Richtung Scrollen. Ich kann auch per Tastertur scrollen, das Problem ist nur: ich möchte das ich mit den Pfeiltasten auch den Scroll Balken bewege. Und das ist das Problem. Ich Poste mal etwas code:
Delphi-Quellcode:
Das Haupt Problem ist einfach das mir ein Wert fällt. Wenn ich beim Scroll
procedure TMyListBox.KeyEv(typ: Integer; key: Word);
var tmp,w,m:Integer; orr:Trect; g:extended; begin if typ = 0 then begin if key = VK_DOWN then begin tmp:=MouseDownIndex+1; g:=0; if tmp <= Count then begin if items[tmp].MyCompo.ry >= ScrollRect.top then begin if items[tmp].MyCompo.ry-(sh-hh-7) > 0 then begin ScrollRect.Top:=items[tmp].MyCompo.ry-(sh-hh-7); ScrollRect.Bottom:=ScrollRect.Top+sh; if fScrollbarY.Position <=0 then fScrollbarY.fPosition:=1 else begin m:=1; // Ein Versuch, geht jedoch nicht if temp2 > DisPlayCount+1 then begin temp2:=0; m:=disPlayCount+1; end else inc(temp2); fScrollbarY.fposition:=fScrollbarY.fposition+disPlayCount; end; end; end; SetItemindex(tmp); end; end; end; end; fScrollbarY.Position:=fScrollbarY.Position+1 mache geht das zwar, aber der wert ist zu klein. Wie kann ich diesen +1 berechnen ? ScrollRect speicher genau den Bild Ausschnitt welcher Angezeigt werden soll. fScrollbarY ist der Scrollbalken. Ich hoffe einer von euch kann mir hier Weiter Helfen. Vielen Dank Im Vorraus Ich hoffe ihr habt das Problem Verstanden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 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