AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Eigene listbox mit TObjeklist Scroll problem
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene listbox mit TObjeklist Scroll problem

Ein Thema von mimi · begonnen am 9. Sep 2006 · letzter Beitrag vom 18. Jun 2007
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Eigene listbox mit TObjeklist Scroll problem

  Alt 9. Sep 2006, 12:21
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?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 14:18
weiß keiner eine lösung für dieses problem ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 14:45
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:
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);
Scrollen mit dreisatz:

indexdeserstensichtbarenEintrags := ((Liste.Count-(height div itemhoehe)) * y) div ermittleheightfuerScrollen; y = Position des Mauszeigers (mousemove)
ermittleheightfuerScrollen = Scrollbereich in Pixeln (der Scollbalken geht ja nicht über die gesamte höhe der Komponnete)

zum itemindex scrollen:
indexdeserstensichtbarenEintrags := itemIndex; Es sind noch einige Sicherheitsabrafen notwendig, die ich wegen der Übersichtlichkeit weggelassen habe, aber im wesentlichen war es das.
Besucht doch mal meine Homepage
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 15:10
vielen dank für deine schnelle antwort. leider verstehe ich das beispiel nicht so ganz:
ich habe ihn versuch einzubauen:
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
    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;
im moment bin ich am überlegen wo ich indexdeserstensichtbarenEintrags ermitteln sollte

und was ist YAnzeigePosition ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 15:16
Jetzt gehts vielen dank für deine hilfe !
Delphi-Quellcode:
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;
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
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 15:48
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 !
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 17:18
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;
Angehängte Dateien
Dateityp: zip mylistbox_641.zip (193,3 KB, 11x aufgerufen)
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 11. Sep 2006, 22:47
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;
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 22. Sep 2006, 11:47
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:
  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
die funktion GetSel funktioniert !!! dort ist folgender code:
[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 !!
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Eigene listbox mit TObjeklist Scroll problem

  Alt 18. Jun 2007, 16:41
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:
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;
Das Haupt Problem ist einfach das mir ein Wert fällt. Wenn ich beim Scroll
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.
Miniaturansicht angehängter Grafiken
bildschirmfoto-gui_test_anwendung_122.png  
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  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 08:24 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