Forum | | | | - Seite 1 - |
| Fred Matthiesen | Hallo und Guten Tag zusammen. Ich begrüße erstmal alle Mitglieder. Probiere die Listviewdll aus und mußte feststellen, das ich ein Problem nicht in den Griff bekomme. Wenn die Beispieldatei gestartet wird, ist das Listview zunächst dunkel. Soweit ok. Jetzt lade ich die DBF-Datei und er zeigt oben links auch die Anzahl der eingelesenen Datensätze an. --- Aber---- das Listvier bleibt dunkel. Ein Linksklick mit der Maus: Fehlanzeige. Nun mit der rechten Maustaste: uiii, joh, das Listview ist sichtbar. Nun aber befinde ich mich schon im Editiermodus eines Items. Das ist für die Funktion korrekt. Nun, ich erwarte, das nach dem Einlesen der DBF-Datei sich das Listview mit seinen Einträgen zeigt. Welcher Befehl muß nach dem Einlesen erfolgen, damit sich das Listview zeigt.
Grüße Fred |
| | | | |
| | | | | - Seite 1 - |
| H.Brill | Hallo, meinste PureBasic 4.0 ? Die Beispielcodes sind noch für die Version 3.94 geschrieben. Mit Version 4.0 brauchste z.B. das Frame3DGadget nicht mehr. Hat damals mit der 3.94 nicht anders geklappt.
Hab dir mal das erste Beispiel auf Version 4.0 umgeschrieben. Ist jetzt nicht ausführlich getestet, hoffe aber, daß es in allen Teilen funktioniert. KompilierenMarkierenSeparierenIncludeFile "Listview.pb"
Global flen.l, lhandle.l, bereich.l, Quit.l
Global datei.s, datei2.s, db_datei.s
Global spalte1.s, spalte2.s, spalte3.s, sp1.s, sp2.s, sp3.s, selected.s
spalte1.s = "Artikel"
spalte2.s = "Menge"
spalte3.s = "Preis"
Dim Spalten.l(3)
Dim Sortspalten.l(3)
; hier wird die Sortierung der einzelnen Spalten festgelegt.
; 0 = nicht sortiert, 2 = Alphabetisch, 3 = Zahlenwert (nur ganze Zahlen)
Sortspalten(0) = 1
Sortspalten(1) = 2
Sortspalten(2) = 2
selected = Space(16384)
; wird global gebraucht, um beim Abfangen von Klicks im LV
; die zeilen hineinzuschreiben. (Siehe Anfang der Repeat - Schleife)
OpenWindow(0, 100, 100, 600, 460,"List - View",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ButtonGadget(5, 5, 10, 70, 20, "Clear")
ButtonGadget(6, 90, 10, 70, 20, "Set Zeile")
ButtonGadget(7, 175, 10 ,70, 20, "Ende")
ButtonGadget(8, 5, 40, 70, 20, "Load DBF")
ButtonGadget(9, 90, 40, 70, 20, "Save to CSV")
ButtonGadget(10,175,40, 70, 20, "Load CSV")
ButtonGadget(11, 175, 70, 70, 20, "Save to DBF")
TextGadget(20, 5, 70, 80, 25, "Anzahl Zeilen : ")
TextGadget(21, 90, 70, 40, 25, "")
TextGadget(22, 270, 10, 40, 20, "Artikel :")
TextGadget(23, 270, 40, 40, 20, "Menge : ")
TextGadget(24, 270, 70, 40, 20, "Preis : ")
StringGadget(25, 320, 10, 240, 20, "")
StringGadget(26, 320, 40, 40, 20, "")
StringGadget(27, 320, 70, 80, 20, "")
;Frame3DGadget(40, 5, 100, 580, 350, "Listview", #PB_Frame3D_Double)
EndIf
fenster.l = WindowID(0)
; Listview initialisieren und erstellen
; hier mit 3 Spalten
lhandle = CreateListview(fenster, 0, 0, RGB(255, 255, 255), -1, $31)
IColumn(lhandle, @spalte1, 240, 0)
IColumn(lhandle, @spalte2, 80, 1)
IColumn(lhandle, @spalte3, 80, 1)
; Sortierung zulassen
ASortListview(lhandle, @Sortspalten(), 3)
; Editieren zulassen
EnableEdits(lhandle, 1)
; Messageverwaltung einschalten
InitMessages(fenster)
; Listview anzeigen
ShowListview(lhandle, 5, 120, 570, 320)
MessageRequester("Hallo !", "Rechtsklick" + Chr(13) + "zum Editieren " + Chr(13) + "benutzen !", #PB_MessageRequester_Ok)
Quit = 0
Repeat
x.l = GetSelected(@selected, @y)
If y = lhandle
Gosub GetEintrag
EndIf
EventID.l = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case 5
; Clear
If GetLines(lhandle) > 0
r.l = DeleteAllItems(lhandle)
SetGadgetText(21, "0")
EndIf
Case 6
; Set
Gosub SetEintrag
Case 7
Quit = 1
Case 8
; Load DBF
datei2 = OpenFileRequester("DBF laden", "", "dBase 3 - Dateien |*.dbf", 0)
If datei2 <> ""
Gosub LoadDBF
Else
MessageRequester("Info", "Keine Datei gewählt !", #PB_MessageRequester_Ok)
EndIf
Case 9
; Save to CSV
datei = SaveFileRequester("CSV speichern", "", "CSV - Dateien |*.csv", 0)
If datei <> ""
Gosub SaveToCSV
Else
MessageRequester("Info", "Keine Datei gewählt !", #PB_MessageRequester_Ok)
EndIf
Case 10
datei = OpenFileRequester("CSV laden", "", "CSV - Dateien |*.CSV", 0)
If datei <> ""
Gosub LoadCSV
Else
MessageRequester("Info", "Keine Datei gewählt !", #PB_MessageRequester_Ok)
EndIf
Case 11
db_datei = SaveFileRequester("DBF speichern", "", "dBase 3 - Dateien |*.DBF", 0)
If db_datei <> ""
Gosub SaveToDBF
Else
MessageRequester("Info", "Keine Datei gewählt !", #PB_MessageRequester_Ok)
EndIf
EndSelect
EndSelect
Until Quit = 1 Or EventID = #PB_Event_CloseWindow
; Messageverwaltung wieder ausschalten
CloseMessages(fenster)
FreeMemory(0)
DestroyWindow_(fenster1)
CloseWindow(0)
CloseLibrary(#lvdll)
End
GetEintrag:
; 3 Spalten
y.l = GetSelectedLine(lhandle)
zeile.s = GetLineText(lhandle, y, @selected)
SetGadgetText(25, StringField(zeile, 1, Chr(9)))
SetGadgetText(26, StringField(zeile, 2, Chr(9)))
SetGadgetText(27, StringField(zeile, 3, Chr(9)))
Return
SetEintrag:
sp1 = GetGadgetText(25)
sp2 = GetGadgetText(26)
sp3 = GetGadgetText(27)
Spalten(0) = @sp1
Spalten(1) = @sp2
Spalten(2) = @sp3
SItem(lhandle, @Spalten(), 3)
anzahl.l = GetLines(lhandle)
SetGadgetText(21, Str(anzahl))
Return
SaveToCSV:
anzb.l = GetNeededMemory(lhandle, 1)
; voraussichtlicher Speicherverbrauch abfragen
bereich = AllocateMemory(anzb)
wbytes.l = ListviewToCsv(lhandle, bereich, 59, 0)
err.l = WriteFileQuick(@datei, bereich, 0, wbytes)
If err <> 0
MessageRequester("Info !", Str(err) + " Bytes" + Chr(13) + "in Datei " + datei + Chr(13) + "geschrieben !", #PB_MessageRequester_Ok)
Else
MessageRequester("Fehler !", "Operation ist fehlgeschlagen !", #PB_MessageRequester_Ok)
EndIf
FreeMemory(0)
Return
LoadDBF:
dbspalten.l
dbzeilen.l
If OpenFile(1, datei2)
flen = Lof(1)
CloseFile(1)
EndIf
If flen > 0
bereich = AllocateMemory(flen)
EndIf
err.l = ReadFileQuick(@datei2, bereich, 0, flen)
If err <> 0
If GetLines(lhandle) > 0
r.l = DeleteAllItems(lhandle)
EndIf
anz.l = DbfToCsv(bereich, flen, @dbspalten, @dbzeilen, 1)
CsvToListview(lhandle, bereich, anz, 3)
SetGadgetText(21, Str(dbzeilen))
SetIndex(dbzeilen)
Else
MessageRequester("Info", "Konnte Datei nicht laden !", #PB_MessageRequester_Ok)
EndIf
FreeMemory(0)
Return
LoadCSV:
If OpenFile(1, datei)
flen = Lof(1)
CloseFile(1)
EndIf
If flen > 0
bereich = AllocateMemory(flen)
EndIf
err.l = ReadFileQuick(@datei, bereich, 0, flen)
If err <> 0
If GetLines(lhandle) > 0
r.l = DeleteAllItems(lhandle)
EndIf
err = CsvToListview(lhandle, bereich, flen, 3)
anzahl.l = GetLines(lhandle)
SetGadgetText(21, Str(anzahl))
Else
MessageRequester("Info", "Konnte Datei nicht laden !", #PB_MessageRequester_Ok)
EndIf
FreeMemory(0)
Return
SaveToDBF:
nb.l = GetNeededMemory(lhandle, 1)
; verfügbarer Platz ermitteln und Speicher allocieren
; ACHTUNG !!!
; da GetNeededMemory() den dBase Header nicht berücksichtigt,
; muß diese Bytezahl manuell dazugerechnet werden.
; die Zahl 4260 ist die max. Zahl an Bytes, die ein
; DBF - Header enthalten kann.
; Der erste Teil des DBF Headers ist normalerweise 32 Byte
; groß. Da hier außer Bytes auch 2 Words und 1 Long gespeichert
; sind (rechne mal 4 Btes für jedes), mache ich mal 36 daraus.
; Dann kommen max. 128 Felder mit einer Feldbeschreibung von
; 32 Bytes + 1 Byte (0DH) als Ende - Markierung.
; somit wäre das 36 + (128 * 33) = 4260 .
; Also geizen wir nicht und machen 5000 Bytes dazu
; So ist auf jeden Fall genug Speicher reserviert.
nb = nb + 5000
bereich = AllocateMemory(nb)
wbytes.l = ListviewToDbf(lhandle, bereich, nb, 0)
err.l = WriteFileQuick(@db_datei, bereich, 0, wbytes)
If err <> 0
MessageRequester("Info !", Str(err) + " Bytes" + Chr(13) + "in Datei " + db_datei + Chr(13) + "geschrieben !", #PB_MessageRequester_OK)
Else
MessageRequester("Fehler !", "Operation ist fehlgeschlagen !", #PB_MessageRequester_OK)
EndIf
FreeMemory(0)
Return
|
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 03.11.2006 ▲ |
| |
| | | Tut mir Leid, aber das ist kein PB Code, das ist Spaghetti
Wozu globale Variablen, wenn Du gar keine Proceduren verwendest. Und warum verwendest Du keine |
| | | | |
| | H.Brill | Heut mach ichs auch anders. Die Beispielcodes hatte ich vor längerer Zeit mal geschrieben. Wollte halt nur mal auf die Schnelle helfen, damit er es zum Laufen bringt. Kann sich ja jeder selber zusammenbasteln.
Aber macht ja nix. Werde künftig nichts mehr schreiben. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 03.11.2006 ▲ |
| |
| | | [quote:d7a00e7ae6]Aber macht ja nix. Werde künftig nichts mehr schreiben.[/quote:d7a00e7ae6] Das darfst du nicht so verbissen sehen - hier wird manchesmal jemand platt gemacht, der nur helfen wollte - Im Grunde sind es alle liebe Menschen und weil es Menschen sind, haben sie auch ihre Macken nobody is perfect Wenn dir also wieder mal nach Helfen zumute ist, dann tu es - mir hat hier auch schon mancher geholfen |
| | | | |
| | | [quote:d7dc5bb2e7=H.Brill] Aber macht ja nix. Werde künftig nichts mehr schreiben.[/quote:d7dc5bb2e7] Mußt doch nicht gleich die beleidigt Leberwurst spielen Wollte nur vermeiden das diejenigen, die PB nicht kennen, einen schlechten Eindruck gewinnen |
| | | | |
| | Frank Abbing | [quote:d4d4597af7] Heut mach ichs auch anders. Die Beispielcodes hatte ich vor längerer Zeit mal geschrieben. Wollte halt nur mal auf die Schnelle helfen, damit er es zum Laufen bringt. Kann sich ja jeder selber zusammenbasteln.
Aber macht ja nix. Werde künftig nichts mehr schreiben. [/quote:d4d4597af7] Heinz, seh das bitte nicht so eng. Der Thomas ist schnell mit ner grossen Klappe dabei, ist doch nix Neues. Ich war sehr froh, dass du mir damals die Codes zur Verfügung gestellt hast. Und immerhin hast du es doch bestens zum Laufen gebracht. Und für mich sieht der Code aufgeräumt aus - solltest mal meine Assemblercodes sehen. |
| | | | |
| | | | - Seite 2 - |
| | | Hallo, irgendwie merke ich doch das ich hier im falschen Forum bin. Ich hatte angenommen, Frank hätte den Beispielcode erstellt. Daher erstmal danke an Heinz für seine Arbeit, so daß man zumindest einen ersten Eindruck über den Einsatz der Listview.dll gewinnt. Ob Spaghetti-Code oder nicht, ist glaube ich, vollkommen uninteressant. Hauptsache man hat erstmal ein Beispiel und erspart sich dadurch Zeit. Wie man selber programmiert liegt an einem selber. Ich selber mit den den Gosub´s groß geworden. Das waren noch die Zeiten von Commondire C64 und Schneider CPC. Da kannte man prozedurale Programmierung noch nicht. Danach kam die objektorientierte Programmierung dazu die sich im Extrem in C++ wiederfindet. Wie gesagt, es kommt immer darauf an, wann man mit Purebasic anfängt und aus welcher Programiererlinie man kommt. Deshalb sollte man nicht meckern sondern überhaupt froh sein, das jemand einem anderen weiterhilft. Auch wenn einer z.B. nicht richtig schreiben kann auf Grund irgendwelcher Erkrankungen oder Mängel, so ist überhaupt anzuerkennen, das so jemand, trotz des Wissens dieses Mangels in ein Forum schreibt und sogar versucht ein eigenes Forum aufzubauen.Hut ab. Wenn dann bestimmte Leute sich dann darüber lustig machen, ist das äußert schade. Ok. Man sollte hier aber nicht das Thema weiter behandeln sondern es geht hier um ein Problem.
Das konnte ich zwischenzeitlich selber lösen. Heinz hat das Framegadget herausgenommen, dadurch kommt es jetzt zur sofortigen Anzeige des leeren Gadgets. Was an dieser Stelle evtl. gar nicht wünschenswert wäre. Das Gadget sollte sich nach dem Einladen der Daten zeigen. Genau dieses Problem hatte Heinz auch im Purebasicforum gepostet. Die Lösung habe ich tatsächlich hier im Forum gefunden. Nach dem Einladen der Daten muß diese Zeile erfolgen: SendMessage_(lhandle,4138,-1,0) ;LVM_UPDATE Dann erscheinen die Daten. Bis dahin bleibt das Listview-Gadget blass. Ich findet, so ist das Verhalten des Gadgets korrekt. Es soll sich ja erst zeigen, wenn Daten vorhanden sind.
Danke für die Beiträge, damit sollte dieses Thema abgeschlossen sein. |
| | | | |
| | | Nun - es geht auch noch anders!
Du könntest auf das framegadged (ich weiß nicht wirklich was das ist als non-pbler) verzichten indem Du dem LV vorher ein sendmessage (listviewhandle,11,0,0) sendest, (schaltet ab das es sich zeichnet) und danach ein sendmessage (listviewhandle,11,1,0).
mit einem invalidaterect (listviewhandle,0,0), redrawwindow (listviewhandle) sollte es dann getan sein.
Somit müsste sogar das Hinzufügen der Elemente deutlich schneller ablaufen. |
| | | | |
| | Frank Abbing | Das ist unnötig, iF. Listview.dlls CreateListview() sendet bereits Message 11 (0) und mit ShowListview() wird die Message wieder aufgehoben (1). Alle Funktionen, die dazwischen liegen, können das Listview aufbauen, ohne dass es ständig aktualisiert wird. Mit LVM_UPDATE (4138) wird ein Listview gezwungen, sich einmal neu aufzubauen und das ist auch genau die dafür vorgesehene Message. Und sonst keine.
Ich melde mich morgen abend, Fred. |
| | | | |
| | | Gut konnte ich ja nicht wissen.
[quote:46fe2d090d]Und sonst keine.[/quote:46fe2d090d] Klar geht redrawwindow. |
| | | | |
| | Fred Matthiesen | Anstatt den Sendmessage-Befehl zu nehmen kann man folgenden Befehl benutzen: KompilierenMarkierenSeparieren Hat die gleiche Wirkung und ist gerade für Anfänger verständlicher, weil er diesen Befehl in der Hilfe nachlesen kann |
| | | | |
| | Frank Abbing | Der benutzt die Message auch. Ab der nächsten Version sind alle Funktionen in der Inc-Datei fest in der Dll eigebaut (auch mit Beschreibung) und stehen dort auch anderen Sprachen zur Verfügung. |
| | | | |
|
AntwortenThemenoptionen | 2.426 Betrachtungen |
ThemeninformationenDieses Thema hat 6 Teilnehmer: |