Forum | | | | | Hallo,
die Funktion GetItemText funktioniert bei mir nicht, wenn ich das LV nicht auf dem Hauptfenster (%hWnd) erstelle. KompilierenMarkierenSeparieren -> KompilierenMarkierenSeparieren ->
Ich habe das gleiche Problem mit v1.6 und v1.7.
Woran kann das liegen? - Mache ich was falsch?
Danke für Eure Mithilfe Thomas |
| | | | |
| | Frank Abbing | Hi,
leider kann ich momentan nicht testen - hatte Systemzusammenbruch und kompletten Datenverlust. Vielleicht kann jemand Anderes das mal probieren. |
| | | | |
| | | Hallo Thomas - könntest Du ein Minimalbeispiel posten - dann kann man es besser nachvollziehen...
Danke! |
| | | | |
| | | KompilierenMarkierenSeparierenLV2 erstellen
lvAuftrag& = CreateListView(%hWnd,%HInstance,GetSysColor(23),GetSysColor(24),-1,$21)
InsertColumn lvAuftrag&,"Beschreibung",0,0
InsertColumn lvAuftrag&,"Art.-Nr." ,0,0
.
.
.
InsertColumn lvAuftrag&,"Bestellmenge",0,2
.
* Daten einlesen, dann LV anzeigen
ShowListview(lvAuftrag&,Width(%hWnd) /100 *4,Height(%hWnd) /100 *34,Width(_GB2%) /100 *94,Height(_GB2%) /100 *80)
* bestimmte Sätze markieren
* markierte Sätze auslesen, z.B. zum Drucken, Speichern usw.
GetItemText(lvAuftrag&,_lvLineMem#,1,_jj%)
_prArtNr$ = Trim$(String$(_lvLineMem#,0))
Die Variable _prArtNr$ enthält den korrekten Eintrag
Werden die Befehle jetzt auf GB2& (Handle einer GroupBox) umgeschrieben:
LV2 erstellen
lvAuftrag& = CreateListView(GB2&,%HInstance,GetSysColor(23),GetSysColor(24),-1,$21)
InsertColumn lvAuftrag&,"Beschreibung",0,0
InsertColumn lvAuftrag&,"Art.-Nr." ,0,0
.
InsertColumn lvAuftrag&,"Bestellmenge",0,2
.
* Daten einlesen, dann LV anzeigen
ShowListview(lvAuftrag&,Width(GB2&) /100 *4,Height(GB2&) /100 *34,Width(GB2&) /100 *94,Height(GB2&) /100 *80)
* bestimmte Sätze markieren
* markierte Sätze auslesen, z.B. zum Drucken, Speichern usw.
GetItemText(lvAuftrag&,_lvLineMem#,1,_jj%)
_prArtNr$ = Trim$(String$(_lvLineMem#,0))
bleibt die Variable _prArtNr$ leer (Inhalt: , Len(_prArtNr$) = 0)
Das verstehe ich nicht!
Thomas
P.S. _jj% ist eine reine Zählvariable, 0 ~ GetLines(LV) -1
P.P.S.: um Code-Tag erweitert von Michael Wodrich |
| | | | |
| | | Nachtrag: Das Listview wird in beiden Fällen korrekt gefüllt mit SetItem lvAuftrag&,cItemData_0$,...,cItemData_n$ Die Anzeige des Listviews erfolgt in beiden Fallen korrekt.
Aber RaiseLine() funktioniert auch nur, wenn als Handle %hWnd angegeben wird. Auch nach einem Wechsel des MessageHandllings über InitMessage(GB2&) klappt es nicht wie erwartet...
Danke |
| | | | |
| | Michael Wodrich | wie wird denn GB2& initialisiert.. (dieser Codeteil fehlt hier).
Besser ist immer ein kleines lauffähiges Codeteil, auch wenn fehlerhaft.
...und Codes bitte möglichst in Code-Tags setzen, da erkennt man mehr... (gerade bei längeren Codes wichtig)
Schöne Grüße Michael Wodrich |
| | | Programmieren, das spannendste Detektivspiel der Welt. | 13.10.2005 ▲ |
| |
| | Frank Abbing | Hi,
ich denke, er vergisst einfach nur das Dialogfenster zu initieren.
[quote:f145ca6078]InitMessages(F)
Initiert das Subclassing für alle verwendeten Listviews im Fenster F.
F : Long - Handle des Fensters, in dem ein Listview erstellt wurde, z.B.(%HWND).
Erst durch diese Funktion wird die automatische Sortierung und die Abfrage angeklickter oder markierter Items möglich. InitMessages() darf nicht für jedes Listview verwendet werden, muß aber für jedes Fenster aufgerufen werden, in dem mindestens ein Listview verwendet wird. Mehrfachaufrufe für ein und dasselbe Fenster sind nicht gestattet und führen zu Fehlern! InitMessages() zapft alle Messages für ein Fenster ab, bevor sie dorthin gelangen. Bestimmte Messages werden dann für eigene Zwecke mißbraucht oder verändert. Am besten ist es, zuerst alle Listviews aufzubauen und mit Text zu füllen, und zum Schluss für jedes Fenster, in dem sich (mindestens) ein Listview befindet, InitMessages() auszuführen. Beendet wird die Funktion mit CloseMessages(), am besten, kurz bevor die Listview.dll wieder entladen wird.
InitMessages(%HWND) InitMessages(DIALOGFENSTER%). [/quote:f145ca6078] |
| | | | |
| | | Erst mal Danke für Eure Antworten.
@Frank: Wie bereits geschrieben, hilft das Einschalten des MessageHandling nix...
@Michael: Wie bschrieben ist GB2& eine GroupBox, erstellt mit Create(Groupbox,%hWnd,Text,0.0.100,100)
Gruss Thomas |
| | | | |
| | Michael Wodrich | [quote:cc5b333cb1=Gast] @Michael: Wie bschrieben ist GB2& eine GroupBox, erstellt mit Create(Groupbox,%hWnd,Text,0.0.100,100)[/quote:cc5b333cb1] Das Problem ist ja einfach, daß wir Deinen Code nicht sehen können. So ist natürlich eine Hilfe nicht möglich. Hier hast Du z.B. einfach einen Tippfehler (Punkte statt Kommata) gemacht. Wie das im echten Code aussieht - na ja...
Da wirst Du dann wohl mal debuggen müssen. Einfach für jedes Element, das beteiligt ist eine Datenausgabe schreiben. Ist das gelieferte Handle wirklich ungleich null usw. Auf diese Art mußt Du Dich dann an den Fehler herantasten. Evtl. statt der Code-Einfügungen auch den richtigen Debugger benutzen - dazu ist er ja da...
Schöne Grüße Michael Wodrich |
| | | Programmieren, das spannendste Detektivspiel der Welt. | 14.10.2005 ▲ |
| |
| | Frank Abbing | So, Gast Thomas.
Jetzt konnte ichs testen. GetItemText() funktioniert einwandfrei auch mit Dialogfenstern! Du machst also irgendwo einen anderen Fehler, wahrscheinlich den Syntaxfehler, wie ihn Michael ja schon beschrieben hatte.
Poste bitte nächstes Mal immer einen kompletten Minimalsource, der das Problem aufweist, das du melden möchtest. Ansonsten ist eine Fehlersuche einfach nicht nachvollziehbar. |
| | | | |
| | | Ok, OK.
einen Syntaxfehler kann ich definitiv ausschließen, denn wenn ich GB2& gegen %hWnd tausche, funktionierts! Außerdem werden Syntaxfehler gemeldet, aber hier habe ich ein kurzes Listing vorbereitet: KompilierenMarkierenSeparierendeclare GB1&,GB2&,GB3&,GB4&,LV1&,LV2&,lvdll&
declare ende&,btn&,txt1&,txt2&
declare LVmarked&,LineMarked&,IsMarked&
declare LV_Mem#,LVItemText$
dim LV_Mem#,256
CLS
ListView DLL & Funktionen bereitstellen
lvdll& = UseDLL("Listview.dll")
$I LV_FUNCTION.INC
InitMessages(%HWnd)
InitMessages(GB2&)
Bildschirmmaske aufbauen
GB1& = Create("Groupbox",%hWnd," Groupbox #1 - Handle des LV auf %hWnd ", 10, 10,300,180)
GB2& = Create("Groupbox",%hWnd," Groupbox #2 - Handle des LV auf GB2& " , 10,210,300,180)
GB3& = Create("Groupbox",%hWnd,"" ,310,140,160, 50)
GB4& = Create("Groupbox",%hWnd,"" ,310,340,160, 50)
txt1& = Create("TEXT" ,GB3& ,"..." , 10, 12,140, 30)
txt2& = Create("TEXT" ,GB4& ,"..." , 10, 12,140, 30)
btn& = Create("Button" ,%hWnd,"DATEN WERDEN EINGELESEN..." , 10,400,620, 30)
ende& = Create("Button" ,%hWnd,"Beenden" ,530, 10,100,380)
EnableWindow btn& ,0
EnableWindow ende&,0
LV erstellen
dieses LV wird auf dem Hauptfenster erstellt
LV1& = CreateListView(%hWnd,%HInstance,RGB(0,0,0),RGB(0,127,127),-1,$25)
InsertColumn LV1&," " ,40,0
InsertColumn LV1&,"LS- Nr." ,90,0
InsertColumn LV1&,"Art.-Nr.",90,0
und dieses auf der Groupbox, die auf dem Hauptfenster erstellt wurde
LV2& = CreateListView(GB2&,%HInstance,RGB(0,0,0),RGB(127,127,127),-1,$25)
InsertColumn LV2&," " ,40,0
InsertColumn LV2&,"LS- Nr." ,90,0
InsertColumn LV2&,"Art.-Nr.",90,0
Einlesen der DB
LS_NR und ART_NR sind alphanumerisch (C,10)
dbOPEN(#1,"LS")
dbUse(#1)
Einlesen
WhileNot %dbEOF
dbGo(&Loop -1)
SetItem LV1&,"",Trim$(dbGet$("LS_NR")),Trim$(dbGet$("ART_NR")),Str$(&LOOP +1)
SetItem LV2&,"",Trim$(dbGet$("LS_NR")),Trim$(dbGet$("ART_NR")),Str$(&LOOP +1)
WEnd
dbClose(#1)
Anzeigen der LVs
ShowListView(LV1&,20,30,252,150)
ShowListView(LV2&,10,20,252,150)
Beginn des Auslesens
SetText btn&,"Zum Auslesen markieren, dann hier klicken..."
EnableWindow ende&,1
EnableWindow btn& ,1
While 1
CLEAR LV_Mem#,LVmarked&,LineMarked&,IsMarked&,LVItemText$
WaitInput
If %GetFocus = ende&
Beenden
break
endif
If %GetFocus = btn&
Wurde in einem LV markiert?
GetChecked(Addr(LVmarked&),Addr(LineMarked&),Addr(IsMarked&))
If IsMarked&
GetItemText(LVmarked&,LV_Mem#,2,LineMarked&)
LVItemText$ = String$(LV_Mem#,0)
If LVmarked& = LV1&
SetText txt1&,LVItemText$
SetText txt2&,"..."
Else
SetText txt1&,"..."
SetText txt2&,LVItemText$
EndIf
SetCheckboxState(LVmarked&,LineMarked&,0)
EndIf
EndIf
WEnd
Handling abschalten
CloseMessages(GB2&)
CloseMessages(%HWnd)
Speicher aufräumen
Dispose clv1#
Dispose clv2#
Dispose clvall#
Dispose lvitem#
DLL entladen
FreeDLL lvdll&
das wars!
END
Hier kann ich zwar in GB2 die Markierung setzen / löschen, aber ausgewertet wird sie nicht...
mfG Thomas
P.S. Auf Wunsch schicke ich die DB als ZIP zu. |
| | | | |
| | | | | | | |
|
AntwortenThemenoptionen | 2.492 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |