| |
|
|
- Seite 1 - |
|
Normann Strübli | Hallo,
von mir war in letzter Zeit wieder wenig zu lesen da ich mich mehr um mein Hardware-Projekt gekümmert habe. Aber tut ja nix zur Sache :roll:
Außerdem hab ich angefangen mit MASM angefangen damit ich den genialen XPIA endlich vernünftig nutzen kann Habe mir das Buch Assembler - Grundlagen der Programmierung von Marcus Roming und Joachin Rhode gekauft was meiner Meinung nach für Assembler Anfänger bestens geeignet ist. Sicherlich gibt es im Internet auch viele Anleitungen, aber ein klein wenig Werbung musste an diese Stelle mal sein da mir das Buch so gut gefällt
Und Frank hat recht wenn er sagt Assembler ist generell gar nicht so schwer - also ran! Es lohnt sich.
So NU aber endlich meine eigentliche Frage: Ich möchte bei den Spalten gerne eine Sortierung nach eigenen Kriterien durchführen lassen. Ich möchte also nach mehreren Eigenschaften gleichzeitig sortieren lassen - z.B. nach Produktgruppe UND Farbe. Dazu habe ich einfach eine Spalte erstellt mit dem Inhalt R123 als Beispiel. R steht für die Farbe Rot und 123 halt für was anderes. Wenn ich diese Spalte nun Sortiere lasse habe ich mein Ziel schon erreicht, allerdings soll der Anwender von diese Spalte ja nix sehen - wär ja blöd. Einfach die Spaltenbreite auf 0 zu setzen bringt ja nix da man sie ja wieder breiter machen kann. Kann man also bestimmte spalten in der Breite irgendwie fixieren? Wenn das auf normalen wege nicht geht siehst Du Frank da eine Chance das in Deine Dll irgenwie mit aufzunehmen? Dann könnte man auch andere Informationen in der Listview verstecken z.B. eindeutige ID-Nummern die der Anwender nicht sieht man aber trotzdem auslesen kann.
gruß Normann |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Frank Abbing | Hallo Normann und iF,
[quote:a341181023]Kann man einer solchen Listview nicht sagen das die Spaltenbreiten nicht durch den Anwender veränderbar sind? [/quote:a341181023] Das geht meines Wissens nach nicht. Aber es gibt dennoch eine Methode, die du in deine Profan-Waitinput-Schleife packen kannst. Mein Testcode Gebührenverwaltung_Stammtisch.prf macht das ja auch so: KompilierenMarkierenSeparierenx&=0
y&=GetColumnWidth(listview&,0)
Case y&<>130:x&=1
y&=GetColumnWidth(listview&,1)
Case y&<>110:x&=1
y&=GetColumnWidth(listview&,2)
Case y&<>110:x&=1
y&=GetColumnWidth(listview&,3)
Case y&<>110:x&=1
y&=GetColumnWidth(listview&,4)
Case y&<>110:x&=1
y&=GetColumnWidth(listview&,5)
Case y&<>110:x&=1
If x&
*** Wenn ja, dann "linker Mausknopf losgelassen" simulieren und ursprüngliche
*** Spaltenbreiten wieder herstellen.
mouse_event(4,0,0,0,0)
SetColumnWidth(listview&,0,130)
SetColumnWidth(listview&,1,110)
SetColumnWidth(listview&,2,110)
SetColumnWidth(listview&,3,110)
SetColumnWidth(listview&,4,110)
SetColumnWidth(listview&,5,110)
EndIf
Da es bei dir nur um eine Zeile geht, ist der Aufwand ja noch geringer Übrigens kannst du ja auch noch ein zweites, unsichtbares Listview generieren...
Willkommen bei Assembler, Normann! Allerdings muß ich dir sagen: Windows 64 Bit steht vor der Tür und da wird sich für Assembler einiges ändern... :roll: |
|
|
| |
|
|
|
Normann Strübli | [quote:07f3459f4b]Windows 64 Bit steht vor der Tür und da wird sich für Assembler einiges ändern...[/quote:07f3459f4b]Na Du bist ja gut - mach mir nur mut! Bleibt doch aber alles Abwärtskompatibel... oder nicht?! Außerdem wenn man die Grundlagen kennt dann kanns ja nicht verkehrt sein.
|
|
|
| |
|
|
|
Normann Strübli | Und es geht doch!
unzwar viel eleganter
Frank, bitte guck dir das ganze mal genauer an. Eigentlich gar nicht so schwer, wäre also schön wenn Dus dann doch in deine Listview.dll integrieren könntest (büdde!) Dann braucht man den kram mit dem Subclassing nicht. Der Quelltext ist ein geänderter von Deinen Beispielen - weils für mich so schneller ging.
Ich möchte das auch noch dahingehend erweitern, das nur bestimmte Spalten fest sind.
Was meint Du? KompilierenMarkierenSeparieren $H windows.ph
$H structs.ph
$H messages.ph
$H commctrl.ph
$H Structs.ph
set("FastMode",1)
Strukturen
STRUCT HD_NOTIFY = ~HD_NOTIFY
DECLARE HD_NOTIFY#
Dim HD_NOTIFY#,HD_NOTIFY
Declare bereich#,listview&,lvdll&,text$,bytes&,bereich#,x&,y&,z&
Def GetSysColor(1) !"USER32","GetSysColor"
$I Listview_Funktionen.inc
proc ListviewCallback
Parameters Wnd&, Msg&, WParam&, LParam&
if Msg& = ~WM_NOTIFY
HD_NOTIFY# = lparam&
if HD_NOTIFY#.iItem& = ~HDN_BeginTrackW Die HDN_BeginTrack Botschaft abfangen und löschen!
If @GetCheck(Check&)
return 1
endif
else
Return ~CallWindowProc(~GetProp(Wnd&,"OldCallback"),Wnd&, Msg&,WParam&,LParam&)
endif
endif
Return ~CallWindowProc(~GetProp(Wnd&,"OldCallback"),Wnd&, Msg&,WParam&,LParam&)
Endproc
lvdll&=usedll("Listview.dll")
SetTrueColor 1
Windowstyle 543
Windowtitle "Listview mit fester Spaltenbreite"
Window 0,0-600,600
Cls GetSysColor(15)
Usefont "MS Sans Serif",10,0,0,0,0
SetDialogFont 1
x&=MixRGBs(GetSysColor(15),$00ffffff)
listview&=CreateListView(%hwnd,%hinstance,0,x&,-1,$31)
Declare Check&
Check& = @Create("CheckBox",%hwnd,"Spaltenbreite Fixieren",400,30,120,20)
text$="LVData/Laeufer_mit_Header.csv"
bytes&=@FileSize(text$)
If bytes&>0
Dim bereich#,bytes&
ReadFileQuick(addr(text$),bereich#,0,bytes&)
x&=SetColumnsFromMem(listview&,bereich#,addr(y&))
CsvToListview(listview&,(bereich#+y&),(bytes&-y&),x&)
Dispose bereich#
EndIf
*** Die Breite der drei ersten Spalten korregieren
SetColumnWidth(listview&,0,-1)
SetColumnWidth(listview&,1,-1)
SetColumnWidth(listview&,2,-1)
AutoSortListview listview&,1,1,1,1,2,2
ShowListView(listview&,32,32,354,456)
InitMessages(%hwnd)
~SetProp(listview&,"OldCallback",~SetWindowLong(listview&,~GWL_WNDPROC, ProcAddr(ListviewCallback,4)))
While 1
waitinput
Case %key=2:BREAK
Wend
CloseMessages(%hwnd)
freedll lvdll&
$I Listview_Dispose.inc
End
|
|
|
| |
|
|
|
Jörg Sellmeyer | Hallo Normann, Das ist ja fantastisch. Außerdem ist die festlegung bestimmter Spalten recht einfach. Man muß nur in der Callbackroutine die If-Abfrage erweitern: KompilierenMarkierenSeparieren Gruß Jörg |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 09.03.2005 ▲ |
|
|
|
|
Normann Strübli | Hi Jörg,
*lol* wie einfach. Aber nu sag mir noch bitte wieso das so ist. (Seh gerade den Wald vor lauter Bäumen nicht) In der Win32 steht doch folgendes: [quote:75fbb01985] iButton Index of the mouse button involved in generating the notification message. This member can be one of these values:
ValueMeaning 0Left button 1Right button 2Middle button [/quote:75fbb01985] Also wieso ist das iButton mit dem Header-index bestückt und nicht mit der gedrückten Maus-Taste? Hä?
Gruß Normann |
|
|
| |
|
|
|
Jörg Sellmeyer | Tja, da wirst Du wohl BG fragen müssen. Ich habs durch puren Zufall rausgekriegt. Bevor ich in der Hilfe nachgelesen habe, habe ich einfach mal den Wert für Button getestet. Hätte ich vorher nachgelesen, wäre ich wohl auch nicht drauf gekommen Gruß Jörg |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 09.03.2005 ▲ |
|
|
|
|
Frank Abbing | Hi,
ja, funktioniert gut! Mit dieser Notifymessage hatte ich mich noch gar nicht richtig beschäftigt Werde ich fest einbauen. |
|
|
| |
|
|
|
Normann Strübli | Dankeschön!
PS: Bin das Wochenende mal wieder nicht da, also nicht wundern falls ich auf etwas nicht Antworte.
gruß Normann |
|
|
| |
|
|
|
Frank Abbing | Hi,
fertig. Hab es als Ex-Style für CreateListview() realisiert. Ist Style $400 gesetzt, dann kann die Breite der Spalten in diesem Listview nicht verändert werden. Ist also ein lokaler Style, gilt aber immer für alle Spalten. |
|
|
| |
|
|
|
Normann Strübli | Hallo Frank,
kann es sein das der Style $400 nicht funktioniert? Habe ihn bisher nicht benutzt da ich immer nur bestimmte Spalten unveränderbar gemacht habe.
Gruß Normann |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
Frank Abbing | Hallo Normann,
ja, du hast recht. Er hatte funktioniert, aber irgendwie ist er in der letzten Version wieder verloren gegangen. Ich kümmere mich darum. |
|
|
| |
|
|
|
Frank Abbing | So, Fehler gefunden. In der nächsten Version funktionieren die festen Spalten wieder. |
|
|
| |
|
|