Autor |
Beitrag |
Prinzz
Beiträge: 31
|
Verfasst: Fr 28.10.05 12:59
Hallo Leute,
hab ein sehr seltsames Problem:
Hab eine TTreeView, in der verschiedene Getränke mit Preisen in Unterkategorieren angezeigt werden. Die Unterkategorien können auf und zugeklappt werden.
Sind nur wenige Getränke in der Liste oder sind die Unterkategorien zugeklappt, so dass alle Infos in die TreeView reinpassen, gibt es kein Problem, sind jetzt aber mehr nodes, als in ein Fenster reinpassen, kommt eine Scrollbar, auf die ich ja keinen direkten Einfluss habe. Sobald ich jetzt aber die TreeView anklicke verschwindet diese Scrollbar, sie wird nicht mehr angezeigt, wenn ich mit der Maus draufklicke bzw. gedrückt halte ist sie da, verschwindet aber direkt wieder, wenn ich ein anderes Programm in den Fordergrund hole, so dass meins verdeckt ist und dann nochmal meines fokusiere erscheint die Scrollbar wieder, sie wird neugezeichnet, aber sobald ich mit der TreeView arbeite ist sie wieder weg.
Habs auch schon manuell mit ShowScrollBar(TProdukte.handle,SB_VERT,true); versucht, aber genau das gleiche Problem, ab und zu sind auch teile der Scrollbar zu sehen, das Problem ist, sie wird einfach nicht neugezeichnet, auch TProdukte.repaint oder refresh hilft nix...
Habt ihr irgendeine Idee was man da machen kann, brauche ganz schnell Hilfe!
Vielen Dank im Vorraus, Gruß Tobi
|
|
Lannes
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Fr 28.10.05 14:29
Hallo,
arbeitest Du in dem Code mit BeginUpdate und EndUpdate?
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Prinzz
Beiträge: 31
|
Verfasst: Fr 28.10.05 14:33
BeginUpdate und EndUpdate hab ich auch schon versucht, wusst aber nicht wirklich wo ichs hinschreiben soll, hab dann bisschen rumprobiert, aber war kein Unterschied...
|
|
Lannes
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Fr 28.10.05 14:59
Hallo,
hast Du denn das BeginUpdate / EndUpdate in deinem Code genutzt als der Fehler auftrat?
Man kann ohne weitere Informationen oder Code von Dir nicht mehr dazu sagen.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Prinzz
Beiträge: 31
|
Verfasst: Sa 29.10.05 11:36
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92:
| procedure THauptForm.TProdukteCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); var t: TTreeNode; nummer: integer; begin
with (sender as TTreeView).Canvas do begin font.name:='Arial'; font.Color:=clblack; font.size:=8; font.Style:=[]; brush.Color:=clwhite; FillRect(node.Displayrect(false)); if (node=TProdukte.Selected) then begin font.Color:=clblack; brush.Color:=$00d9ffff; FillRect(node.Displayrect(true)); end; if node.count=0 then begin TextOut(TProdukte.Width-canvas.TextWidth('['+floattostrF(produkt[pos_rechnen(node)].Preis/100,fffixed,18,2)+' €'+'] ')-20,node.displayrect(true).top,'['+floattostrF(produkt[pos_rechnen(node)].Preis/100,fffixed,18,2)+' €'+']'); font.Style:=[]; end;
if node.Count>0 then begin font.Style:=[fsbold,fsitalic]; font.Color:=clmaroon; end else if (cdsHot in state) then begin font.Color:=clmaroon; font.Style:=[fsunderline]; end else begin font.Color:=clnavy; font.Style:=[]; end; TextOut(node.displayrect(true).left,node.displayrect(true).top,node.text);
if TProdukte.Selected<>nil then begin t:=TProdukte.Selected; if (t.Count=0) and (t<>nil) then begin EPreis.caption:=' '+floattostrF(produkt[ausw.Pro].Preis/100,fffixed,18,2)+' €'+' {'+produkt[ausw.Pro].AlkWert+' Punkte}';
if focus<>'TProdukte' then PAnz.Hide else begin
if PAnz.Visible=false then PAnz.Show;
nummer:= Pos_Rechnen(t); if PAnz.Tag<>nummer then begin PAnz.Tag:=nummer; EAnz.Text:='1'; end;
PAnz.Top:=TProdukte.Top + t.displayrect(true).top - 1; PAnz.Left:=TProdukte.Left + t.displayrect(true).right + 10; end; end else begin EPreis.Caption:='---'; if PAnz.Visible=true then begin PAnz.Hide; TProdukte.SetFocus; end; end; end else begin EPreis.Caption:='---'; if PAnz.Visible=true then begin PAnz.Hide; TProdukte.SetFocus; end; end;
end; end; |
|
|
Lannes
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Sa 29.10.05 17:54
Hallo,
in der DrawItem-Prozedur kann ich keine Fehler feststellen die Dein Problem verursachen könnten.
Beeinflusst Du die Scrollbar in irgendeiner Form?
Was wird in anderen Ereignissen des TreeView ausgeführt?
Noch ein Paar Anmerkungen zu Deinem Code:
Delphi-Quelltext 1: 2: 3:
| TextOut(TProdukte.Width-canvas.TextWidth(.... TextOut(TProdukte.ClientWidth-canvas.TextWidth( |
ist focus eine globale Variable?, da könntest Du auch eventuell etwas ändern:
Delphi-Quelltext 1: 2: 3:
| if focus<>'TProdukte' then PAnz.Hide if ActiveControl <> TProdukte then PAnz.Hide |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Prinzz
Beiträge: 31
|
Verfasst: So 30.10.05 02:46
Danke schonmal für die Tipps und die nette Hilfe!
Nee, ich beeinflusse die Scrollbar überhaupt nicht, sie wird auch nicht von irgendwelchen Fenstern verdeckt, sie kommt ja auch automatisch und wird auch gezeichnet, nur sobald ich die TreeView anklicke ist sie verschwunden, nur optisch, ist halt einfach weiß anstatt scrollbar, wenn ich sie anklicke taucht sie zum teil nochmal auf!? Hätte mir ja gedacht, dass es vielleicht ein Fehler der Komponente ist, aber wundert mich, dass sonst noch niemand das Problem hatte, also muss es doch irgendwie an meinem Code liegen!? Theoretisch geht mein Programm auch so, aber solche Schönheitsfehler müssen nicht sein finde ich...
Nachtrag:
Hab grad rausgefunden, woran es liegt:
Ich hatte ein kleines Panel über dem TreeView liegen (übrigens nicht über der Scrollbar), das sich mit dem Fokus verschoben hat, dieses hab ich jetzt neben das Treeview verschoben und jetzt bleibt die Scrollbar wenigstens bei normalem Betrieb da.
Sie wird aber immer noch nicht neugezeichnet, wenn ich ein anderes Windows-Fenster drüberlege oder eben das kleine Fenster drüber haben möchte, das sollte nämlich eigentlich schon da hin!?
Ich werd hier noch verrückt...
|
|
Lannes
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 30.10.05 12:55
Hallo,
Prinzz hat folgendes geschrieben: | Ich werd hier noch verrückt... |
immer gelassen bleiben und Fehler suchen. Alle Codeblöcke die sich mit dem TreeView beschäftigen,
auskommentieren und dann nach und nach wieder aktivieren,
bis Du den Fehler gefunden hast. Eventuell trifft das TTreeView, Borderstyle geändert, Scrollbars verschwinden auch bei Dir zu.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Prinzz
Beiträge: 31
|
Verfasst: So 30.10.05 13:22
Titel: Juhu!!
Super, danke!!!
Der Link war genau das, was ich gesucht habe, was dort stand hat mir zwar nicht geholfen (hab borderStyle auf bsSingle umgestellt und war immer noch wie vorher) aber ich hab dann dort ein bisschen mit Werten rumgespielt und folgendes hat geklappt:
borderStyle = bsNone;
borderWidth = 1 liefert diesen bescheuerten Fehler
borderWidth = 0 löst das Problem!!!!!
Da ich in dem anderen Forum nicht angemeldet bin und dort das Problem ja anscheinend auch nicht gelöst wurde würd ich dich bitten, wenns nicht zu viel Umstände bereitet, das dort hinzuschreiben...
Vielen Dank für die Hilfe!! Gruß Tobi
|
|
|