Forum | | | | Peter Gückstock | Hallo, Ich bin noch nicht lange hier in der Community und komme noch nicht ganz so klar, wo und wie ich meine Frangen an der richtigen Stelle schreibe. Ich versuche es einfach hier.
Mein Problem ist folgendes: Ich habe eine DB III Datenbank in eien Listbox eingelesen. In der Listbox markiere ich eine Zeile und möchte jetzt die Feldinhalte des entsprechenden Datensatzes für die weitere Berechnung erhalten. Für einen Lösungsvorschlag wäre ich Euch dankbar. (Bin Anfänger mit qualmendem Kopf) KompilierenMarkierenSeparierenProgramm-Kasse
unter Verwendung von Programm-Listbox4, Autor: Gerhard Putschalka
------Deklarationen
Declare LiBox&,BonBox1&,Zeile&,Anzahl&,BOk%,Anz_Spalten%,X%,Feld$,Zeile$,Lv_Liste#
Declare Dlg%,Ende%,InpFile$,SatzN%,OpCod$,Datum$,Betrag$,BOk%,Tx$,LV_Zeile&,Lv_Item#,LV_Selected#
declare LV_ColMask&,Listbox&,Number#,TxtBER#,Bon$,Bon3$,Bbox&,Kassieren%,UBox&
declare Epreis!,Gegeben!,EPreis$,Menge%,Posten!,Summe!,Umsatz!,Zurück!,übernehmen%,Art$,E%,S$
declare Bon2$,Bon1$,Bon0$,Zeilennummer%,Zeilennummer$,Index&,DsNr$,DsNr%
-----Definition der Funktion (link zum API)
Def @CreateWindowEx(12) ! USER32,CreateWindowExA
def GetSysColor(1) !USER32,GetSysColor
Def @GetSelectedCount(1) @Sendmessage(@&(1),$1032,0,0)
Dim TxtBer#,255 max. Textlänge einer Listboxzeile (sollte genügend groß sein)
Dim NumBer#,300 Größe = maximal auszuwählende Zeilen * 4 (bei Bedarf erweitern)
===========
Prozeduren
============
-----Modul1 Spalten für die Listbox erstellen
Proc Erstelle_Spalte
Parameters Handle&,Maske&,Format&,Pixel&,Text$,Spalte&
Long Lv_Liste#,0 = Maske&
Long Lv_Liste#,4 = Format&
Long Lv_Liste#,8 = Pixel&
Long Lv_Liste#,12 = @add(Lv_Liste#,36)
Long Lv_Liste#,16 = 220
Long Lv_Liste#,20 = Spalte&
string Lv_Liste#,36 = Text$
@sendmessage (Handle&,$101B,Spalte&,Lv_Liste#)
Inc Anz_Spalten%
Return
Endproc
------Erstellen der Listboxen, Butten u.s.w.
Proc Erstelle_Dialog
Let Dlg% = @CreateDialog(%Hwnd,Angebot,0,0,800,580)
let Ende% = @createbutton(Dlg%,beenden,10,500,80,24)
Let BOk% = @CreateButton(Dlg%,übernehmen,100,410,90,24)
Let Kassieren% = @CreateButton(Dlg%,Kassieren,8,450,80,20)
Usefont Ms Sans Serif,16,0,0,0,0
setdialogfont 1
Dim Lv_Liste#,256
String Lv_Liste#,0 = SysListView32 muß SysListView32 lauten
String Lv_Liste#,20 =
Let LiBox& = @CreateWindowEx($0000280,Lv_Liste#,Lv_Liste#,$50408205,5,5,290,400,
Dlg%,1,%hinstance,$200)
@SendMessage(LiBox&,$1036,0,$00000023) setze extended Style. $23 ist liniert.
Let BBox& = control(LISTBOX,,$54A00148,550,50,200,350,
Dlg%,2001,%HINSTANCE,$00020000)
let UBox&=control(LISTBOX,,$54200140,250,80,280,60,
Dlg%,2001,%HINSTANCE,$00020121)
-------Einfügen der Spalten in die Listbox
Erstelle_Spalte LiBox&,15,0,40,Nr.,0
Erstelle_Spalte LiBox&,15,0,120,Artikel,1
Erstelle_Spalte LiBox&,15,0,100,Preis,2
Erstelle_Spalte BonBox1&,15,0,40,Nr.,0
Let Anz_Spalten% = 3 initialisiere Spaltenzähler
----- initialisieren der Bereich für spätere Verwendung
Long Lv_Liste#,0 = 1 Maske
Long Lv_Liste#,4 = 0
Long Lv_Liste#,8 = 0
Long Lv_Liste#,12 = 0
Long Lv_Liste#,16 = 0
Long Lv_Liste#,20 = @add(Lv_Liste#,36)
Long Lv_Liste#,24 = 220
Long Lv_Liste#,28 = 0
Long Lv_Liste#,32 = 0
Return
EndProc
----------------------------------------------------
-----------------------Zeile hinzufügen
Proc Add_Zeile füge eine Zeile zum Listview hinzu. Zeile& enthält die Zeilennummer.
Declare X1%
Long Lv_Liste#,4 = Zeile& Zeile
Long Lv_Liste#,8 = 0 Spalte
Let X1% = 1 Schleifen- und Indexzähler
String Lv_Liste#,36 = @$(X1%)
@Sendmessage (LiBox&,$1007,0,Lv_Liste#) Text in 1. Spalte
Texte für die Spalten 2 - 3
While (X1% < 3)
Long Lv_Liste#,8 = X1%
Inc X1%
String Lv_Liste#,36 = @$(X1%)
@Sendmessage(LiBox&,4142,Zeile&,Lv_Liste#) Text in Folgespalte
EndWhile
Return
---------------------------
Auswerten was selektiert wurde.
Mit der Message $0190 wird ermittelt wieviele
Zeilen markiert wurden.
Mit der Message $0191 werden die Nummern der markierten Zeilen als LongInteger
(= jeweils 4 Stellen) in die Bereichsvariable NumBer# übernommen.
danach werden in der 2. Schleife mit der Message $0189 die gespeicherten
Zeilennummern ausgelesen und damit die jeweilige Textzeile in die Bereichsvariable
TxtBer# übernommen.
Let X%=0
Let Anzahl&=@Sendmessage(ListBox&,$0190,0,0)
@Sendmessage(ListBox&,$0191,Anzahl&,NumBer#)
WhileNot (X% = Anzahl&)
Let Index& = @Long(NumBer#,@Mul(X%,4)) Zeilennummer holen
@Sendmessage(ListBox&,$0189,Index&,TxtBer#) Text aus der Liste holen
Inc X%
EndWhile
EndProc
===========================================================
============Hier beginn mein Problem:======================
===========================================================
Proc Berechnen
---------------------------jetzt Eingabe, wieviele Artikel
Menge%=0
Menge%=@Input$(Anzahl:,ausgewählter Artikel,Menge%) funktioniert
-------------------------
Das Einlesen der Datenbank funktioniert auch .
Jetzt möchte ich die Datensatznummer zur Bearbeitung erhalten, die der markierten
Zeile in der Listbox entspricht.
@dbOpen(#1,Sortiment_dbf.dbf)
@dbUse(#1)
DsNr$=Index& mein Gedanke, Datensatznummer gleich Index von markierter Zeile
@dbgo(DsNr$) und dann zum entsprechenden Datensatz gehen
geht aber nicht
Momentan erhalte ich dummerweise immer den ersten Datensatz.
die Berechnungen würden mit den richtigen Werten aus der DB auch funktionieren
Epreis$=@dbGet$(Preis) jetzt Preise berechnen und in Bon schreiben
Art$=@dbGet$(Artikel)
EPreis!=@val(EPreis$)
Posten!=Menge%*EPreis!
Decimals 2
Summe!=Summe!+Posten!
Decimals 2
Umsatz!=Summe!
Decimals 2
Bon$=str$(Menge%),art$, Str$(EPreis!), ,str$(Summe!)Str$(TxtBer#,0
Bon3$=der Umsazt beträgt,str$(Umsatz!)
@AddString(Bbox&,Bon$)
endproc
-----Modul Rückgeld berechnen
proc Rückgeld
let Gegeben!=@input$(Bitte den vom Kunden erhaltenen Betrag eingeben,Eingabe,Gegeben!)
Decimals 2
Zurück!=Gegeben!-Summe!
Decimals 2
UseFont Arial,16,0,0,0,0
SetDialogFont 1
@AddString(Ubox&,Bon3$)
endproc
-----Modul Kassierung
proc Summe
Bon3$=Summe,str$(Summe!)
Bon2$=Gegeben,str$(Gegeben!)
Bon1$=Rückgeld,str$(Zurück!)
@Addstring(BBox&,--------------------)
@Addstring(BBox&,Bon0$)
@Addstring(BBox&,Bon3$)
@Addstring(BBox&,Bon2$)
@Addstring(BBox&,Bon1$)
@Addstring(BBox&,Vielen Dank)
endproc
========================
Programm Start
========================
Erstelle_Dialog erstelle Dialog, ListView, erstelle die Spalten
Let Zeile& = 0
jetzt öffnen wir die Kundendatei und lesen alle Sätze in die Listbox ein.
Let Anzahl& = @dbOpen(#1,Sortiment_dbf.dbf)
@dbUse(#1)
Let SatzN% = 0
Let OpCod$ = |<
While (SatzN% < Anzahl&)
Inc SatzN% erhöhe Satzzahl
@dbGo(OpCod$)
Add_Zeile @dbGet$(lfdNr),@dbGet$(Artikel),@dbGet$(Preis)
Let OpCod$ = > für nächster Satz
Let Zeile& = (Zeile& + 1) erhöhe Zeilennummer
EndWhile
----------------------------------
WhileNot @GetFocus(Ende%) 1. Schleife bis beenden Button gedrückt wurde
Hier kommen noch andere Module rein.
if getfocus(BOK%)
Berechnen
Endif
if getfocus(Kassieren%)
Rückgeld
summe
endif
-----------------Programm beenden
waitkey warte auf Ende-Button
EndWhile Ende_Schleife
let E%=MessageBox(Wirklich beenden?,Programmende,282)
-----------------Arrays freigeben
Dispose TxtBer#
Dispose NumBer#
Dispose Lv_Liste#
@dbClose(#1)
end
|
| | | | |
| | | verschoben nach Programmierung / Allgemein / Einsteigerfragen
Bitte Quelltexte immer mit [ code] quelltext [ /code] einkapseln - habs oben korgieriert.
Welche Profanversion Du nutzt solltest Du in Deine Signatur eintragen. |
| | | | |
| | Thomas Freier | Siehe dir die Listbox7 an, da wird das erklärt. Aus allen Feldern einer Zeile wird ein String erzeugt, in dem die Felder (Spalteninhalt) durch ein Tabulatorbyte (oder @Chr$(09) ) getrennt werden. Diese Zeichen werden dann durch / oder Andere .......mit @Translate$(Feld$,, / ) ersetzt. Der Inhalt eines Feldes wird dann mit @SubStr$(Feld$,N,/) ermittelt (N = Spalte). Soll direkt auf einen Datensatz der Datenbank zurückgegriffen werden, z.B. um MEMO-Felder auszulesen, ist es sinnvoll, in der 1. Spalte mit BREITE=0, die Datensatznummer (&dbRecNo) zu speichern.
Gruß Thomas Freier |
| | | | |
| | Peter Gückstock | Hallo Thomas,
ich möchte mich für meine späte Antwort entschuldigen, aber ich war betrieblich eingespannt und hatte für meinen PC gar keine Zeit mehr.
vielen Dank für Deine Hilfe, es funktioniert jetzt. Aber jetzt habe ich zwei weitere Fragen: 1. Wie kann man die Schriftart und die Zeichengröße beim Einlesen der Daten aus der Datenbank in die Listbox verändern (zB. die Schrift vergrößern)? Meine Versuche mit setfont waren ergebnislos. 2. Kann man einzelnen Datensätzen in der Listbox unterschiedliche Schriftfarbe zuordnen? (um z.B. zusammengehörige Datensätze von den anderen farblich zu unterscheiden)
Meine Profanversion: 6.6
Gruß Peter Gückstock |
| | | | |
| | Thomas Freier | Hallo Peter,
Schriftänderung für Dialoge usw. nur über UseFont S,N1,N2,N3,N4,N5 Es können nur Farben für die Tabelle, nicht für eine Spalte oder Zeile vorgegeben werden (mein Kenntnisstand). Gruppendarstellung hatte ich durch Einsatz von Icons getestet. Die müssen ja nicht die von Profan wie im Beispiel sein. Ist aber Geschmackssache. Um deine Wünsche umzusetzen, kommst du wie ich nicht um Franks LISTVIEW herum. Lohnt sich für Einsteiger aber erst ab XProfan 8.0 . Die Anpassung für 6.6 ist nicht so einfach. Also SH-Xprofan 8/9 und Franks LISTVIEW hier besorgen und testen. Da die LISTVIEW Shareware ist, würde ich heute XProfan 10 testen, d.h., die Hilfe Datei hier besorgen und studieren, ob die Version alles das was du realisieren willst ohne Franks LISTVIEW kann.
Gruß Thomas |
| | | | |
| | Thomas Freier | Nachtrag:
soll es bei Profan 6.6 bleiben und Gruppen durch Icons gekennzeichnet werden, hier nach Iconen suchen ( Michael Wodrich ?) oder mit > Z-Icon.exe Tool können Sie nicht nur vorhandene Icon-Dateien bearbeiten, >sondern auch Icons aus Dateien z.B. EXE, DLL und ICL auslesen, editieren..... beschaffen und im eigenen Programm die Profan-Icon mit >P-Icon-Changer.exe (müsste hier zu finden sein) austauschen.
Gruß Thomas |
| | | | |
| | Michael Wodrich | Hallo Thomas,
da hast Du wohl Deine HTML-Info in ein Notepad-Fenster zum Umkopieren gezogen... Es sind keine Links mehr in Deinem Text.
Ich hab keine Icons auf meiner HP. Und sowas in Datenbanken zu ermöglichen, da hilft die ListView von Frank Abbing. Auch das Einfärben der Zeilen ist damit möglich.
Kannst Dein Posting ja nochmal bearbeiten und die Links hinzufügen. Über dem Editfenster den Globus mit dem Kettenglied benutzen...
Schöne Grüße Michael Wodrich |
| | | Programmieren, das spannendste Detektivspiel der Welt. | 24.02.2007 ▲ |
| |
| | | Um Links zu posten müssen diese einfach nur reinkopiert werden - URLs werden doch vollautomatisch in Links konvertiert... |
| | | | |
| | Thomas Freier | Hallo Michael,
verwende eigentlich im Prinzip keine Links. Auch auf den Vereinswebseiten, deren Webmaster ich bin, werden im Gästebuch keine Links zugelassen oder von mir abgeändert. Denke, damit kann man das leidige Thema, gerade hier erst diskutiert, aus dem Weg gehen. Zu den Icons : hier oder unter profan.de hatte einer eine ZIP mit Iconen angeboten. Wer? In Gerhards Listview - für Profan 6.6 - kann der 1.Spalte ein Icon zugeordnet werden. Selbst verwendet . So wie Peter Gückstock es vor hat, Artikelgruppen deutlicher hervorzuheben, würden ja einfarbige Icons reichen, die er gut selbst mit IrfanView.exe oder der Z-Icon.exe von : Andreas Baumann Softwareservice Flottenstr. 58 D-13407 Berlin erstellen kann. Webadresse im Programm nicht benannt. Ursprung: 1999/2002. Irgendwo beim Suchen nach Icon-Programmen die Downloadadresse gefunden.
Gruß Thomas |
| | | | |
| | Peter Gückstock | Danke für Eure Tipps. Ich habe das so gelöst: Jeder Artikel der Gleichen Gruppe bekommt im ersten Feld der Datenbank die gleiche Ziffer zugewiesen. Nach dem Einlesen in die Listbox und anschließendem Sortieren nach dieser Spalte habe ich zusammenhängende Blöcke erhalten.
Gruß Peter G. |
| | | | |
|
AntwortenThemenoptionen | 4.587 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |