Hier nun ein Update !
Damit es mit der Demoversion läuft, habe ich das Programm aufgeteilt. So ist nun Platz für weitere Erweiterungen. Wer die Vollversion hat, kann natürlich alles zusammenfassen.
Alle 4 Dateien kommen in logischerweise ins gleiche Verzeichnis. Die Dateinamen müssen mit den IncludeAnweisungen übereinstimmen.
Wer es testen mag, möge bitte etwas Feedback geben, als Anregung und zur Fehlerbeseitigung, denn Fehler gibt es bestimmt.
Code: Alles auswählen
;MiniAdr_Declare.pb
;Declare Anweisungen + Konstanten etc für MiniAdress
Declare MainInfo()
Declare CreateListIcon()
Declare CreateListIconColumn()
Declare DateiLaden(titel,flag=0)
Declare DateiNeu()
Declare DateiSpeichern(flag=0)
Declare DatenIni()
Declare DatenListe()
Declare DatenListeTitel(satz$)
Declare DatenNeu()
Declare DatenSortierenAuswahl()
Declare DatenSortierenEnde()
Declare DatenSortierenStart()
Declare DatenSuchListe()
Declare DatenSuchListeClose()
Declare DatenSuchen(abitem)
Declare Datenaendern()
Declare Datenloeschen()
Declare DatensuchenFirst(modus)
Declare DatensuchenNext()
Declare EingabeEnde()
Declare EingabeFenster(info$,vorgabe$,item)
Declare EingabeLeer()
Declare EingabeOk()
Declare Eingabecheck(pbnr)
Declare GetOrderArray()
Declare ListeAutosize(pbnr)
Declare TasteReturn()
Declare VergleicheSatz(q$,s$)
Declare.s DateiAuswahl(flag=0,dat$="")
Declare.s Datensatzholen(item)
Declare.s Datensatzholen_Save(item)
Declare.s ReadDatensatz(dnr)
Declare FeldAendern()
Declare FeldAendernCbox()
Declare FeldData()
Declare FeldEnde()
Declare FeldFenster()
Declare FeldGadgets(welchesgadget)
Declare FeldKill()
Declare FeldListbox()
Declare FeldNeu()
Declare FeldNeuCbox()
Declare FeldObenUnten(flag)
Declare FeldStart()
Declare FeldTest(pbnr,name$)
Declare TitelFenster(flag=0)
Declare TitelEnde()
Declare TitelListBox()
Declare TitelAendern()
Declare TitelLoeschen()
Declare TitelAnhaengen()
; Konstanten und Import Befehl nur für die Demoversion nötig
#LF$ = Chr(10): #TAB$ = Chr(9)
#WM_KEYDOWN = 256: #VK_RETURN = 13
#WS_POPUPWINDOW = 2156396544: #EM_SETSEL = 177
#MB_ICONEXCLAMATION = 48: #MB_ICONASTERISK = 64
#LVM_ENSUREVISIBLE = 4115
#LVM_SETCOLUMNWIDTH = 4126
#LVM_GETCOLUMNORDERARRAY = 4155
#LVSCW_AUTOSIZE_USEHEADER = -2
Import "USER32.lib"
SendMessage_(a.i,b.i,c.i,d.i) As "_SendMessageA"
EndImport
;Menu + Button Nummern als Konstanten
Enumeration
#menu_new: #menu_load: #menu_load1: #menu_save: #menu_save1: #menu_ende
#menu_neu: #menu_edit: #menu_kill: #menu_such1: #menu_such2: #menu_suchN
#menu_sort
#menu_titel: #menu_spDel: #menu_spIns
#menu_info: #menu_inf1
#window_main: #main_liste: #main_info
#window_sort
#sort_box1: #sort_box2: #sort_box3: #sort_start: #sort_ende: #sort_gk: #sort_up: #sort_dn
#window_eingabe
#eingabe_leer: #eingabe_save: #eingabe_ende: #eingabe_scb1: #eingabe_scb2
#window_Feld
#feld_box: #feld_oben: #feld_unten: #feld_kill
#feld_cb1: #feld_ein1: #feld_name
#feld_cb2: #feld_ein2: #feld_neu
#feld_data: #feld_start: #feld_ende
#window_suchen
#suchliste: #suchlisteEnd
#window_Titel
#titel_box: #titel_ein: #titel_name: #titel_ende: #titel_kill
#taste_return
EndEnumeration
;weitere Konstanten
#suchart1 = "alle Eingaben enthalten"
#maxfelder = 20
#maxbreite = 200
Structure myProgrammvariablen
dateiname.s
desktopbreite.i ;Breite des Monitors in Pixel
desktophoehe.i ;Höhe
windowbreite.i ;
windowhoehe.i ;
subwindowx.i ;
subwindowy.i ;
buttonbr.i ;Buttonbreite
buttonhh.i ;
datensatz.s ;letzter geladener, bearbeiteter Datensatz
eingabeitem.i ;
suchmodus.i ;enthalten im ganzen Datensatz oder im Feld
suchwort.s
suchsatz.s
suchitem.i
suchgk.i ;bei Suche Groß/Kleinschrift beachten
suchlv.i ;
suchart.s ;für verschiedene Sucharten, in dieser Version nur eine
feldanzahl.i ;
feldnamen.s[#maxfelder+1] ;Platz für Felder reservieren = 0 - 20
feldbreite.i[#maxfelder+1] ;wir benutzen Feld null allerdings nicht
eingabepbnr.i[#maxfelder+1] ;für Identnummern der StringGadgets = Eingabefelder
orderarray.i[#maxfelder+1] ;für Drag and Drop = verschieben der Spalten
titelflag.i ;für diverse Spalten Funktionen
EndStructure
Global prgv.myProgrammvariablen
Macro WinZeile(i) ;zur Berechnung der Gadgetzeile im Eingabefenster
10+((i)*30) ;i muß in Klammern stehen, weil i z.B. j-1 sein kann
EndMacro
Code: Alles auswählen
;MiniAdr_Procedure0.pb
;Prozeduren für MiniAdress
Procedure MainInfo()
x$ = "Bitte Datei öffnen oder Datei Neu wählen"
flags = #PB_Text_Center|#PB_Text_Border|512
TextGadget(#main_info,100,30,prgv\windowbreite-200,100,x$,flags)
EndProcedure
Procedure DatenIni()
With prgv
ExamineDesktops()
\desktopbreite = DesktopWidth(0)
\desktophoehe = DesktopHeight(0)
\windowbreite = 650
\windowhoehe = 500
\subwindowx = 50
\subwindowy = 30
\buttonbr = 85
\buttonhh = 22
For j = 0 To #maxfelder
\eingabepbnr[j] = j + #PB_Compiler_EnumerationValue
Next
EndWith
EndProcedure
Procedure CreateListIcon()
UseGadgetList(WindowID(#window_main))
flags = #PB_ListIcon_HeaderDragDrop|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect
ListIconGadget(#main_liste, 0, 0, prgv\windowbreite, prgv\windowhoehe-44, "Leer", 0, flags)
If IsGadget(#main_info): FreeGadget(#main_info): EndIf
EndProcedure
Procedure CreateListIconColumn()
For j = 1 To prgv\feldanzahl
AddGadgetColumn (#main_liste, j, prgv\feldnamen[j],1)
Next
EndProcedure
Procedure DateiNeu()
;If IsGadget(#main_liste): ClearGadgetItems(#main_liste): EndIf
prgv\dateiname = ""
StatusBarText(0, 0, prgv\dateiname)
FeldFenster()
EndProcedure
Procedure DateiLaden(titel,flag=0)
If titel = 0
For j = 1 To #maxfelder: prgv\feldnamen[j] = Str(j): Next
EndIf
If flag = 0
prgv\dateiname = DateiAuswahl(0,prgv\dateiname)
Else
prgv\dateiname = GetCurrentDirectory() + "miniadress.txt"
EndIf
dnr = ReadFile(#PB_Any,prgv\dateiname)
If dnr
j = 0
While Eof(dnr) = 0
prgv\datensatz = ReadDatensatz(dnr)
If j = 0 ;wird nur einmal ausgeführt, um Liste zu erstellen
j = 1
prgv\feldanzahl = CountString(prgv\datensatz, #LF$) - 1
If prgv\feldanzahl > 20
MessageRequester("Error","mehr als 20 Felder",#MB_ICONASTERISK)
End
EndIf
CreateListIcon()
CreateListIconColumn()
HideGadget(#main_liste,1) ;für schnelleres Laden der Liste
EndIf
If titel
titel = 0: DatenListeTitel(prgv\datensatz)
Else
AddGadgetItem(#main_liste,-1, prgv\datensatz)
EndIf
Wend
CloseFile(dnr)
EndIf
StatusBarText(0, 0, prgv\dateiname)
StatusBarText(0, 1, Str(CountGadgetItems(#main_liste)))
ListeAutosize(#main_liste) ;enthält HideGadget(#main_liste,0)
EndProcedure
Procedure DateiSpeichern(flag=0)
If prgv\dateiname = "" Or flag = 1
prgv\dateiname = DateiAuswahl(1,prgv\dateiname)
EndIf
dnr = CreateFile(#PB_Any, prgv\dateiname)
If dnr
orderflag = GetOrderArray()
For item = -1 To CountGadgetItems(#main_liste) - 1 ;ab -1 = Spaltentitel
If orderflag
x$ = Datensatzholen_Save(item) ;:Debug x$
Else
x$ = Datensatzholen(item) ;:Debug x$
EndIf
ReplaceString(x$,#LF$,#TAB$,#PB_String_InPlace)
WriteStringN(dnr, x$)
Next
CloseFile(dnr)
EndIf
StatusBarText(0, 0, prgv\dateiname)
StatusBarText(0, 1, "gespeichert: " + Str(item))
EndProcedure
Procedure DatenSuchenFirst(modus)
If Not prgv\feldanzahl: ProcedureReturn: EndIf
prgv\suchmodus = modus
prgv\suchgk = 0
Select modus
Case 1
prgv\suchwort = InputRequester("Suchen","Suchbegriff: ",prgv\suchwort)
If prgv\suchwort = "": ProcedureReturn: EndIf
prgv\suchitem = DatenSuchen(0)
If prgv\suchitem = -1: MessageRequester("Information","nix gefunden!",#MB_ICONASTERISK): EndIf
Case 11
EingabeFenster("Suchen",prgv\suchsatz,-2)
EndSelect
EndProcedure
Procedure DatenSuchenNext()
If Not prgv\feldanzahl: ProcedureReturn: EndIf
weitersuchen:
prgv\suchitem = DatenSuchen(prgv\suchitem+1)
If prgv\suchitem = -1
info$ = "nix mehr gefunden!"+#LF$+#LF$+"von Beginn an weitersuchen ?"
antwort = MessageRequester("Information",info$,#PB_MessageRequester_YesNo|#MB_ICONEXCLAMATION)
If antwort = #PB_MessageRequester_Yes: Goto weitersuchen: EndIf
EndIf
EndProcedure
Procedure DatenSuchen(abitem)
ok = -1
SetGadgetState(#main_liste,-1)
Select prgv\suchmodus ;wird in DatensuchenFirst() gesetzt
Case 1: ;prgv\suchwort wird in DatensuchenFirst() gesetzt
For item = abitem To CountGadgetItems(#main_liste) - 1
x$ = Datensatzholen(item)
s$ = prgv\suchwort
If prgv\suchgk = 0: x$ = LCase(x$): s$ = LCase(s$): EndIf
If FindString(x$, s$, 1)
StatusBarText(0, 1, s$ + " in " + "Satz: " + Str(item+1))
SendMessage_(GadgetID(#main_liste),#LVM_ENSUREVISIBLE,item,1)
SetGadgetState(#main_liste,item): SetActiveGadget(#main_liste)
ok = item: Break
EndIf
Next
Case 11 ;prgv\suchsatz wird in EingabeOk() gesetzt
For item = abitem To CountGadgetItems(#main_liste) - 1
x$ = Datensatzholen(item): ori$ = x$
s$ = prgv\suchsatz
If prgv\suchgk = 0: x$ = LCase(x$): s$ = LCase(s$): EndIf
If VergleicheSatz(x$, s$) = 1
If prgv\suchlv ;Ausgabe in Suchliste
AddGadgetItem(#suchliste, -1, Str(item+1) + ori$)
ok = item
Else
StatusBarText(0, 1, "Satz: " + Str(item+1))
SendMessage_(GadgetID(#main_liste),#LVM_ENSUREVISIBLE,item,1)
SetGadgetState(#main_liste,item): SetActiveGadget(#main_liste)
ok = item: Break
EndIf
EndIf
Next
If prgv\suchlv: ListeAutosize(#suchliste): EndIf
EndSelect
ProcedureReturn ok
EndProcedure
Procedure DatenSuchListe()
;Hinweis: Feldbreite wurde in Eingabefenster ermittelt/festgelegt
DisableWindow(#window_main,1)
OpenWindow(#window_suchen, 0, 0, 450, 350, "Suchergebnis", #PB_Window_ScreenCentered,WindowID(#window_main))
ListIconGadget(#suchliste, 0, 0, 450, 300, "Nr.", 40, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
For j = 1 To prgv\feldanzahl
AddGadgetColumn(#suchliste, j, prgv\feldnamen[j], prgv\feldbreite[j])
Next
ButtonGadget(#suchlisteEnd, 10, 320, prgv\buttonbr, prgv\buttonhh, "Schließen")
EndProcedure
Procedure DatenSuchListeClose()
CloseWindow(#window_suchen)
DisableWindow(#window_main,0)
EndProcedure
Procedure DatenNeu()
EingabeFenster("Neu",prgv\datensatz, -1) ; -1 = ans Ende der Liste
EndProcedure
Procedure DatenAendern()
item = GetGadgetState(#main_liste)
If item > -1
prgv\datensatz = Datensatzholen(item)
EingabeFenster("Ändern",prgv\datensatz,item)
Else
MessageRequester("Information","kein Eintrag markiert!")
EndIf
EndProcedure
Procedure DatenLoeschen()
item = GetGadgetState(#main_liste)
If item > -1
prgv\datensatz = Datensatzholen(item)
RemoveGadgetItem(#main_liste,item): SetGadgetState(#main_liste,item)
Else
MessageRequester("Information","kein Eintrag markiert!")
EndIf
EndProcedure
Procedure DatenSortierenAuswahl()
If Not prgv\feldanzahl: ProcedureReturn: EndIf
Shared sort1, sort2, sort3
DisableWindow(#window_main,1)
OpenWindow(#window_sort, 0, 0, 320, 305, "", #WS_POPUPWINDOW | 1,WindowID(#window_main))
TextGadget(#PB_Any, 10, 10, 300, prgv\buttonhh, "Wählen Sie die Sortierreihenfolge")
ListViewGadget(#sort_box1, 10, 40, 100, 200)
ListViewGadget(#sort_box2, 110, 40, 100, 200)
ListViewGadget(#sort_box3, 210, 40, 100, 200)
ButtonGadget (#sort_start, 10, 250, prgv\buttonbr, prgv\buttonhh, "Start")
ButtonGadget (#sort_ende , 10, 275, prgv\buttonbr, prgv\buttonhh, "Abbruch")
CheckBoxGadget(#sort_gk, 110, 250, prgv\buttonbr*2, prgv\buttonhh, "Groß/Kleinschrift beachten")
OptionGadget (#sort_up, 110, 275, prgv\buttonbr, prgv\buttonhh, "aufsteigend")
OptionGadget (#sort_dn, 210, 275, prgv\buttonbr, prgv\buttonhh, "absteigend")
For j = 1 To prgv\feldanzahl
AddGadgetItem (#sort_box1, -1, prgv\feldnamen[j])
AddGadgetItem (#sort_box2, -1, prgv\feldnamen[j])
AddGadgetItem (#sort_box3, -1, prgv\feldnamen[j])
Next
SetGadgetState(#sort_box1, sort1)
SetGadgetState(#sort_box2, sort2)
SetGadgetState(#sort_box3, sort3)
EndProcedure
Procedure DatenSortierenStart()
Shared sort1, sort2, sort3
sort1 = GetGadgetState(#sort_box1)
sort2 = GetGadgetState(#sort_box2)
sort3 = GetGadgetState(#sort_box3)
sorttiefe = 25
datenposi = 1 + (sorttiefe*3)
datenanzahl = CountGadgetItems(#main_liste)-1: Dim daten$(datenanzahl+1)
For j = 0 To datenanzahl
x$ = Datensatzholen(j)
a$ = LSet(StringField(x$, sort1+2, #LF$), sorttiefe)
a$ + LSet(StringField(x$, sort2+2, #LF$), sorttiefe)
a$ + LSet(StringField(x$, sort3+2, #LF$), sorttiefe)
daten$(j) = a$ + x$
Next
If GetGadgetState(#sort_gk) = 0: sortoption = #PB_Sort_NoCase: EndIf
If GetGadgetState(#sort_dn) = 1: sortoption = #PB_Sort_Descending|sortoption: EndIf
SortArray(daten$(),sortoption,0,datenanzahl)
HideGadget(#main_liste,1): ClearGadgetItems(#main_liste)
For j = 0 To datenanzahl
x$ = Mid(daten$(j), datenposi): AddGadgetItem(#main_liste,-1, x$)
Next
HideGadget(#main_liste,0)
DatenSortierenEnde()
EndProcedure
Procedure DatenSortierenEnde()
CloseWindow(#window_sort): DisableWindow(#window_main,0)
EndProcedure
Procedure DatenListe()
Select EventType() ;die 768 gilt für Tasten Pfeil oben/unten
Case #PB_EventType_LeftClick, 768: StatusBarText(0, 1, "Satz: " + Str(GetGadgetState(#main_liste)+1))
Case #PB_EventType_LeftDoubleClick: Datenaendern()
EndSelect
EndProcedure
Procedure DatenListeTitel(satz$)
;erstellt aus dem 1. gelesenem Datensatz die Titel der Spalten
For j = 1 To prgv\feldanzahl
prgv\feldnamen[j] = StringField(satz$,j+1,#LF$)
SetGadgetItemText(#main_liste, -1, prgv\feldnamen[j], j)
Next
EndProcedure
Procedure DatenListeResize()
prgv\windowbreite = WindowWidth(#window_main)
prgv\windowhoehe = WindowHeight(#window_main)
If IsGadget(#main_liste)
ResizeGadget(#main_liste, #PB_Ignore, #PB_Ignore, prgv\windowbreite, prgv\windowhoehe-44)
;InvalidateRect_(GadgetID(#main_liste), 0, 0)
ListeAutosize(#main_liste)
EndIf
EndProcedure
Procedure EingabeFenster(info$,vorgabe$,item)
If Not prgv\feldanzahl: ProcedureReturn: EndIf
With prgv
\eingabeitem = item ;\eingabeitem = wofür ist die Eingabe, siehe EingabeOk()
DisableWindow(#window_main,1)
OpenWindow(#window_eingabe, 0, 0, 0, 0, info$, #PB_Window_ScreenCentered,WindowID(#window_main))
AddKeyboardShortcut(#window_eingabe, #PB_Shortcut_Alt|#PB_Shortcut_L, #eingabe_leer)
AddKeyboardShortcut(#window_eingabe, #PB_Shortcut_Alt|#PB_Shortcut_A, #eingabe_ende)
AddKeyboardShortcut(#window_eingabe, #PB_Shortcut_Escape, #eingabe_ende)
AddKeyboardShortcut(#window_eingabe, #PB_Shortcut_Return, #taste_return)
For j = 1 To \feldanzahl
\feldbreite[j] = GetGadgetItemAttribute(#main_liste, 0, #PB_ListIcon_ColumnWidth, j)
If \feldbreite[j] < 99: \feldbreite[j] = 99: EndIf
If j < 11 ;max Feldbreite links
If \feldbreite[j] > maxbreite: maxbreite = \feldbreite[j]: EndIf
Else ;max Feldbreite rechts
If \feldbreite[j] > maxbreite2: maxbreite2 = \feldbreite[j]: EndIf
EndIf
Next
infolg = 60
infosp = 10: eingabesp = 5 + infosp + infolg
infosp2 = 10 + eingabesp + maxbreite: eingabesp2 = 5 + infosp2 + infolg
windowbreite = 460
If maxbreite2
If eingabesp2 + maxbreite2 > windowbreite
windowbreite = eingabesp2 + maxbreite2 + 20
EndIf
EndIf
For j = 1 To \feldanzahl
k = j
If j > 10: k - 10: EndIf
If j = 11: infosp = infosp2: eingabesp = eingabesp2: EndIf
TextGadget(#PB_Any, infosp, 3+WinZeile(k-1), infolg, \buttonhh, \feldnamen[j], #PB_Text_Right)
x$ = StringField(vorgabe$, j+1, #LF$)
StringGadget(\eingabepbnr[j], eingabesp, WinZeile(k-1), \feldbreite[j], \buttonhh, x$);,#ES_NOHIDESEL)
Next
saveinfo$ = "ändern"
If \eingabeitem = -1
saveinfo$ = "Hinzufügen"
ElseIf \eingabeitem = -2
saveinfo$ = "Suchen"
EndIf
k = 11
ButtonGadget(#eingabe_leer, 10, WinZeile(k), \buttonbr, \buttonhh, "&Leer")
ButtonGadget(#eingabe_save, 110, WinZeile(k), \buttonbr, \buttonhh, saveinfo$)
ButtonGadget(#eingabe_ende, 210, WinZeile(k), \buttonbr, \buttonhh, "&Abbruch")
SetActiveGadget(\eingabepbnr[1])
SendMessage_(GadgetID(\eingabepbnr[1]),#EM_SETSEL,0,-1) ;markieren und Cursor ans Ende
If \eingabeitem = -2 ;Sucheingabe
k + 1
CheckBoxGadget(#eingabe_scb1, 10, WinZeile(k), \buttonbr*2, \buttonhh, "Groß/Kleinschrift beachten")
CheckBoxGadget(#eingabe_scb2, 210, WinZeile(k), \buttonbr*2, \buttonhh, "Ausgabe in Liste")
;hier ev. Optiongadgets für Sucharten
EndIf
windowhoehe = WinZeile(k+2)
x = \subwindowx + WindowX(#window_main)
y = \subwindowy + WindowY(#window_main)
ResizeWindow(#window_eingabe, x, y, windowbreite, windowhoehe)
EndWith
EndProcedure
Procedure EingabeLeer()
For j = 1 To prgv\feldanzahl: SetGadgetText(prgv\eingabepbnr[j],""): Next
SetActiveGadget(prgv\eingabepbnr[1])
EndProcedure
Procedure EingabeOk()
With prgv
;Eingaben auslesen
eingabe$ = #LF$: For j = 1 To \feldanzahl: eingabe$ + GetGadgetText(\eingabepbnr[j]) + #LF$: Next
If Len(eingabe$) > \feldanzahl+1 ;es gibt es eine Eingabe in irgendeinem Feld
Select \eingabeitem ;wird in EingabeFenster gesetzt
;Suchen
Case -2: \suchsatz = eingabe$
\suchgk = GetGadgetState(#eingabe_scb1) ;wenn 1, Groß/Klein beachten
\suchlv = GetGadgetState(#eingabe_scb2) ;wenn 1, Ausgabe in Liste
;hier ev. Abfrage für Optiongadgets Sucharten
\suchart = #suchart1
EingabeEnde()
If \suchlv: DatenSuchListe(): EndIf
\suchitem = DatenSuchen(0)
If \suchitem = -1
MessageRequester("Information","nix gefunden!",#MB_ICONASTERISK)
EndIf
;Neu
Case -1: \datensatz = eingabe$
AddGadgetItem(#main_liste, -1, eingabe$)
ListeAutosize(#main_liste)
;Ändern
Case 0 To CountGadgetItems(#main_liste)
RemoveGadgetItem(#main_liste,\eingabeitem) ;entfernen
AddGadgetItem(#main_liste, \eingabeitem, eingabe$) ;einfügen
ListeAutosize(#main_liste)
EingabeEnde()
EndSelect
Else ;alle Felder sind leer
SetActiveGadget(\eingabepbnr[1])
EndIf
EndWith
EndProcedure
Procedure EingabeEnde()
CloseWindow(#window_eingabe): DisableWindow(#window_main,0)
EndProcedure
Procedure GetOrderArray()
ok = SendMessage_(GadgetID(#main_liste), #LVM_GETCOLUMNORDERARRAY, prgv\feldanzahl+1, @prgv\OrderArray[0])
For j = 0 To prgv\feldanzahl
i = prgv\OrderArray[j] ;:Debug GetGadgetItemText(#main_liste,-1,i)
x$ + Str(i) + ","
Next
StatusBarText(0, 1, x$)
ProcedureReturn ok
EndProcedure
Procedure ListeAutosize(pbnr)
HideGadget(pbnr,1)
For j = 1 To prgv\feldanzahl
SendMessage_(GadgetID(pbnr), #LVM_SETCOLUMNWIDTH, j, #LVSCW_AUTOSIZE_USEHEADER)
breite = GetGadgetItemAttribute(pbnr, 0, #PB_ListIcon_ColumnWidth, j)
If breite > #maxbreite
SetGadgetItemAttribute(pbnr, 0, #PB_ListIcon_ColumnWidth, #maxbreite, j)
EndIf
Next
HideGadget(pbnr,0)
EndProcedure
Procedure TasteReturn()
welchesActiveGadget = GetActiveGadget()
Select welchesActiveGadget
Case prgv\eingabepbnr[1] To prgv\eingabepbnr[prgv\feldanzahl]
For j = 1 To prgv\feldanzahl
If prgv\eingabepbnr[j] = welchesActiveGadget
SendMessage_(GadgetID(prgv\eingabepbnr[j]),#EM_SETSEL,0,0) ;Markierung aufhebn
j + 1: If j > prgv\feldanzahl: j = 1: EndIf
SetActiveGadget(prgv\eingabepbnr[j])
SendMessage_(GadgetID(prgv\eingabepbnr[j]),#EM_SETSEL,0,-1) ;markieren + ans Ende
Break
EndIf
Next
EndSelect
EndProcedure
Procedure VergleicheSatz(q$,s$)
ok = -1
For j = 1 To prgv\feldanzahl
qitem$ = StringField(q$, j+1, #LF$)
sitem$ = StringField(s$, j+1, #LF$)
If sitem$
Select prgv\suchart ;wird in EingabeOk() gesetzt
Case #suchart1 ;alle Eingaben enthalten
If FindString(qitem$, sitem$,1)
ok = 1
Else
ok = -1: Break
EndIf
EndSelect
EndIf
Next
ProcedureReturn ok
EndProcedure
Procedure.s DateiAuswahl(flag=0,dat$="")
file$ = GetCurrentDirectory() + GetFilePart(dat$)
patt$ = "Text (*.txt)|*.txt;|Alle Dateien (*.*)|*.*"
If flag = 0
file$ = OpenFileRequester("Laden: Datei auswählen oder neuen Namen eingeben", file$, patt$, 0)
Else
file$ = SaveFileRequester("Speichern: Datei auswählen oder neuen Namen eingeben", file$, patt$, 0)
EndIf
If file$ = "": file$ = GetCurrentDirectory() + "miniadress.txt": EndIf
ProcedureReturn file$
EndProcedure
Procedure.s Datensatzholen(item)
x$ = "": For j = 0 To prgv\feldanzahl: x$ + GetGadgetItemText(#main_liste, item, j) + #LF$: Next
ProcedureReturn x$
EndProcedure
Procedure.s Datensatzholen_Save(item)
;holt einen Datensatz mit dem OrderArray
x$ = ""
For j = 0 To prgv\feldanzahl
i = prgv\orderarray[j]: x$ + GetGadgetItemText(#main_liste, item, i) + #LF$
Next
ProcedureReturn x$
EndProcedure
Procedure.s ReadDatensatz(dnr)
x$ = ReadString(dnr) ;:Debug x$
If Right(x$,1) <> #TAB$: x$ + #TAB$: EndIf
ReplaceString(x$,#TAB$,#LF$,#PB_String_InPlace)
ProcedureReturn x$
EndProcedure
Code: Alles auswählen
;MiniAdr_Procedure1.pb
;Proceduren für MiniAdress, Felddefiniton
Procedure FeldGadgets(welchesgadget)
Select welchesgadget
Case #feld_box: FeldListbox()
Case #feld_oben: FeldObenUnten(0)
Case #feld_unten: FeldObenUnten(1)
Case #feld_kill: FeldKill()
Case #feld_cb1: FeldAendernCbox()
Case #feld_cb2: FeldNeuCbox()
Case #feld_neu: FeldNeu()
Case #feld_name: FeldAendern()
Case #feld_data: FeldData()
Case #feld_start: FeldStart()
Case #feld_ende: FeldEnde()
Case #menu_titel: TitelFenster()
Case #menu_spDel: TitelFenster(1)
Case #menu_spIns: TitelAnhaengen()
Case #titel_box: TitelListBox()
Case #titel_name: TitelAendern()
Case #titel_ende: TitelEnde()
Case #titel_kill: TitelLoeschen()
EndSelect
EndProcedure
Procedure FeldFenster()
DisableWindow(#window_main,1)
x = prgv\subwindowx + WindowX(#window_main)
y = prgv\subwindowy + WindowY(#window_main)
br = 400: hh = 350
OpenWindow(#window_Feld, x, y, br, hh, "Felder", 0,WindowID(#window_main))
x1 = 200: x2 = x1 + 10 + prgv\buttonbr
y = 10: ListViewGadget(#feld_box, 10, y, 170, hh-50)
y = 10: ButtonGadget (#feld_oben, x1, y, prgv\buttonbr, prgv\buttonhh, "nach oben")
y + 30: ButtonGadget (#feld_unten,x1, y, prgv\buttonbr, prgv\buttonhh, "nach unten")
y + 30: ButtonGadget (#feld_kill, x1, y, prgv\buttonbr, prgv\buttonhh, "löschen")
y + 30: CheckBoxGadget(#feld_cb1, x1, y, prgv\buttonbr, prgv\buttonhh, "Name ändern ")
y + 30: StringGadget (#feld_ein1, x1, y, prgv\buttonbr, prgv\buttonhh, "")
ButtonGadget (#feld_name, x2, y, prgv\buttonbr, prgv\buttonhh, "ändern")
y + 30: CheckBoxGadget(#feld_cb2, x1, y, prgv\buttonbr, prgv\buttonhh, "Feld neu ")
y + 30: StringGadget (#feld_ein2, x1, y, prgv\buttonbr, prgv\buttonhh, "")
ButtonGadget (#feld_neu, x2, y, prgv\buttonbr, prgv\buttonhh, "hinzufügen")
y = hh - 30
ButtonGadget (#feld_data, 10, y, prgv\buttonbr, prgv\buttonhh, "Vorgaben")
ButtonGadget (#feld_start,x1, y, prgv\buttonbr, prgv\buttonhh, "Start")
ButtonGadget (#feld_ende, x2, y, prgv\buttonbr, prgv\buttonhh, "Abbruch")
DisableGadget(#feld_oben,1)
DisableGadget(#feld_unten,1)
DisableGadget(#feld_kill,1)
DisableGadget(#feld_cb1,1): DisableGadget(#feld_ein1,1): DisableGadget(#feld_name,1)
DisableGadget(#feld_ein2,1): DisableGadget(#feld_neu,1)
EndProcedure
Procedure FeldEnde()
CloseWindow(#window_Feld): DisableWindow(#window_main,0)
EndProcedure
Procedure FeldListbox()
DisableGadget(#feld_oben,1)
DisableGadget(#feld_unten,1)
DisableGadget(#feld_kill,1)
DisableGadget(#feld_cb1,1): DisableGadget(#feld_ein1,1): DisableGadget(#feld_name,1)
fbanz = CountGadgetItems(#feld_box)
fbitem = GetGadgetState(#feld_box) ;wer ist markiert ab 0 ?
If fbitem = -1: flag = 0 ;keins ist markiert
ElseIf fbitem = 0: flag = 1 ;das 1.ist markiert
ElseIf fbitem = fbanz-1: flag = 2 ;das letzte ist markiert
Else: flag = 3 ;irgendeins dazwischen
EndIf
If flag & 2: DisableGadget(#feld_oben,0): EndIf
If flag & 1: DisableGadget(#feld_unten,0): EndIf
If flag & 3: DisableGadget(#feld_kill,0): EndIf
If flag & 3: FeldAendernCbox(): EndIf
EndProcedure
Procedure FeldObenUnten(flag)
fbitem = GetGadgetState(#feld_box) ;wer ist markiert ab 0 ?
name$ = GetGadgetItemText(#feld_box, fbitem)
RemoveGadgetItem(#feld_box, fbitem)
If flag = 0: fbitem-1: Else: fbitem+1: EndIf
AddGadgetItem(#feld_box, fbitem, name$)
SetGadgetState(#feld_box, fbitem)
FeldListbox()
EndProcedure
Procedure FeldKill()
fbitem = GetGadgetState(#feld_box) ;wer ist markiert ab 0 ?
If fbitem > -1
RemoveGadgetItem(#feld_box, fbitem)
SetGadgetState(#feld_box, fbitem)
FeldListbox()
EndIf
EndProcedure
Procedure FeldData()
ClearGadgetItems(#feld_box)
Restore Data_FeldNamen ;Vorgaben lesen
Read.i anz
For j = 1 To anz: Read.s name$: AddGadgetItem(#feld_box, -1, name$): Next
SetGadgetState(#feld_box, 0)
FeldListbox()
EndProcedure
Procedure FeldAendern()
fbitem = GetGadgetState(#feld_box) ;wer ist markiert ab 0 ?
name$ = Trim(GetGadgetText(#feld_ein1))
If Feldtest(#feld_box,name$)
SetGadgetItemText(#feld_box, fbitem, name$)
SetGadgetState(#feld_box, fbitem)
EndIf
EndProcedure
Procedure FeldAendernCbox()
fbitem = GetGadgetState(#feld_box) ;wer ist markiert ab 0 ?
If fbitem > -1
DisableGadget(#feld_cb1,0)
name$ = GetGadgetItemText(#feld_box,fbitem)
SetGadgetText(#feld_ein1,name$)
If GetGadgetState(#feld_cb1)
DisableGadget(#feld_ein1,0): DisableGadget(#feld_name,0)
Else
DisableGadget(#feld_ein1,1): DisableGadget(#feld_name,1)
EndIf
EndIf
EndProcedure
Procedure FeldNeu()
name$ = Trim(GetGadgetText(#feld_ein2))
If Feldtest(#feld_box,name$): AddGadgetItem(#feld_box, -1, name$): EndIf
EndProcedure
Procedure FeldNeuCbox()
If GetGadgetState(#feld_cb2)
DisableGadget(#feld_ein2,0): DisableGadget(#feld_neu,0)
Else
DisableGadget(#feld_ein2,1): DisableGadget(#feld_neu,1)
EndIf
EndProcedure
Procedure FeldTest(pbnr,name$)
fbanz = CountGadgetItems(pbnr)
For j = 0 To fbanz - 1
feldboxname$ = Trim(GetGadgetItemText(pbnr,j))
If name$ = feldboxname$
MessageRequester("Info","Name bereits vorhanden")
ProcedureReturn 0
EndIf
Next
ProcedureReturn 1
EndProcedure
Procedure FeldStart()
;erst auslesen, denn gleich wird das Fenster zerstört und der Inhalt auch
prgv\feldanzahl = CountGadgetItems(#feld_box)
For j = 1 To prgv\feldanzahl
prgv\feldnamen[j] = Trim(GetGadgetItemText(#feld_box,j-1))
Next
CloseWindow(#window_Feld)
DisableWindow(#window_main,0)
CreateListIcon()
CreateListIconColumn()
prgv\dateiname = ""
prgv\datensatz = ""
StatusBarText(0, 0, prgv\dateiname)
StatusBarText(0, 1, Str(CountGadgetItems(#main_liste)))
ListeAutosize(#main_liste)
EndProcedure
Procedure TitelFenster(flag=0)
If Not prgv\feldanzahl: ProcedureReturn: EndIf
prgv\titelflag = flag ;wird in TitelListbox() gebraucht
Select flag
Case 0: titel$ = "Spaltennamen ändern"
Case 1: titel$ = "Spalte entfernen"
EndSelect
DisableWindow(#window_main,1)
x = prgv\subwindowx + WindowX(#window_main)
y = prgv\subwindowy + WindowY(#window_main)
br = 400: hh = 350
OpenWindow(#window_Titel, x, y, br, hh, titel$, 0,WindowID(#window_main))
x1 = 200: x2 = x1 + 10 + prgv\buttonbr
y = 10: ListViewGadget(#titel_box, 10, y, 170, hh-50)
y + 30: StringGadget (#titel_ein, x1, y, prgv\buttonbr, prgv\buttonhh, "")
ButtonGadget (#titel_name, x2, y, prgv\buttonbr, prgv\buttonhh, "ändern")
y = hh - 30
ButtonGadget (#titel_kill,x1, y, prgv\buttonbr, prgv\buttonhh, "Löschen")
ButtonGadget (#titel_ende, x2, y, prgv\buttonbr, prgv\buttonhh, "Abbruch")
For j = 1 To prgv\feldanzahl
AddGadgetItem(#titel_box,-1,prgv\feldnamen[j])
Next
Select flag
Case 0: HideGadget(#titel_kill,1)
DisableGadget(#titel_ein,1): DisableGadget(#titel_name,1)
Case 1: DisableGadget(#titel_kill,1)
HideGadget(#titel_ein,1): HideGadget(#titel_name,1)
EndSelect
EndProcedure
Procedure TitelEnde()
CloseWindow(#window_Titel): DisableWindow(#window_main,0)
EndProcedure
Procedure TitelListBox()
fbitem = GetGadgetState(#titel_box) ;wer ist markiert ab 0 ?
If fbitem > -1
Select prgv\titelflag
Case 0: ;Spaltenname ändern
DisableGadget(#titel_ein,0): DisableGadget(#titel_name,0)
name$ = GetGadgetItemText(#titel_box,fbitem)
SetGadgetText(#titel_ein,name$)
Case 1: DisableGadget(#titel_kill,0)
EndSelect
EndIf
EndProcedure
Procedure TitelAendern()
;Hinweis: in der Titelbox wird ab null gezählt
;der oberste Spaltename ist also item 0
;hingegen die Feldnamen bzw. die Spaltennamen der main_liste
;beginnen bei 1, denn Spalte null wird nicht benutzt !
fbitem = GetGadgetState(#titel_box) ;wer ist markiert ab 0 ?
name$ = Trim(GetGadgetText(#titel_ein))
If Feldtest(#titel_box,name$)
SetGadgetItemText(#titel_box, fbitem, name$)
SetGadgetState(#titel_box, fbitem)
SetGadgetItemText(#main_liste, -1, name$, fbitem+1)
prgv\feldnamen[fbitem+1] = name$
ListeAutosize(#main_liste)
EndIf
EndProcedure
Procedure TitelLoeschen()
fbitem = GetGadgetState(#titel_box) ;wer ist markiert ab 0 ?
If fbitem > -1
name$ = GetGadgetItemText(#titel_box,fbitem)
text$ = "Wollen Sie die Spalte > " + name$ + " < wirklich löschen ?"
antwort = MessageRequester("Warnung", text$, #PB_MessageRequester_YesNo|#MB_ICONEXCLAMATION)
If antwort = #PB_MessageRequester_Yes
fbitem + 1 ; Erklärung siehe TitelAendern()
HideGadget(#main_liste,1)
RemoveGadgetColumn(#main_liste, fbitem)
ListeAutosize(#main_liste) ;incl. HideGadget(#main_liste,0)
prgv\feldanzahl - 1
For j = 1 To prgv\feldanzahl
prgv\feldnamen[j] = GetGadgetItemText(#main_liste,-1,j)
Next
TitelEnde()
text$ = "die Spalte [ " + name$ + " ] wurde entfernt" + #LF$ + #LF$
text$ + "Entgültig gelöscht wird die Spalte" + #LF$
text$ + "aber erst dann, wenn die Daten gespeichert werden !"
MessageRequester("Hinweis", text$, #MB_ICONASTERISK)
EndIf
EndIf
EndProcedure
Procedure TitelAnhaengen()
text$ = "Wie soll die Spalte heißen ?" + Space(22) + "(Esc = Abbruch)"
name$ = InputRequester("neue Spalte", text$, "neu")
name$ = Trim(name$)
If name$
prgv\feldanzahl + 1
If prgv\feldanzahl > 20
MessageRequester("Error","mehr als 20 Felder",#MB_ICONASTERISK)
Else
HideGadget(#main_liste,1)
AddGadgetColumn(#main_liste, prgv\feldanzahl, name$,1)
prgv\feldnamen[prgv\feldanzahl] = name$
ListeAutosize(#main_liste)
text$ = "die Spalte [ " + name$ + " ] wurde angehängt" + #LF$ + #LF$
text$ + "Sie können die Spalte nun mit der Maus verschieben !"+ #LF$ + #LF$
text$ + "Entgültig Teil der Datei wird die Spalte" + #LF$
text$ + "aber erst dann, wenn die Daten gespeichert werden !"
MessageRequester("Hinweis", text$, #MB_ICONASTERISK)
EndIf
EndIf
EndProcedure
Code: Alles auswählen
;MiniAdr_Main1.pb
;Mini Adress für DemoVersion PB 4.3 x86
IncludeFile "MiniAdr_Declare.pb"
IncludeFile "MiniAdr_Procedure0.pb"
IncludeFile "MiniAdr_Procedure1.pb"
#version = "MiniAdress von HJ Bremer" + #LF$ + "® Mai 2009 - Version 2.04"
; Programmoberfläche definieren----------------------
DatenIni()
flags = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget
OpenWindow(#window_main, 0, 0, prgv\windowbreite, prgv\windowhoehe, "MiniAdress (PB 4.3 x86)", flags)
MainInfo()
CreateStatusBar(0, WindowID(#window_main))
AddStatusBarField(#PB_Ignore)
AddStatusBarField(#PB_Ignore)
CreateMenu(0, WindowID(#window_main))
MenuTitle("&Datei")
MenuItem( #menu_new, "&Neu")
MenuItem( #menu_load, "Ö&ffnen" + #TAB$ + "Strg+O")
MenuItem( #menu_save, "&Speichern" + #TAB$ + "Strg+S")
MenuItem( #menu_save1, "Speichern &als...")
MenuBar()
MenuItem( #menu_load1, "Öffnen ohne Titel")
MenuBar()
MenuItem( #menu_ende, "&Beenden" + #TAB$ + "Alt+F4")
MenuTitle("&Bearbeiten")
MenuItem( #menu_neu, "&Neu" + #TAB$ + "Strg+N")
MenuItem( #menu_edit, "&ändern")
MenuItem( #menu_kill,"&löschen")
MenuTitle("&Suchen")
MenuItem( #menu_such1, "&Suchen" + #TAB$ + "Strg+F / F4")
MenuItem( #menu_such2, "Suchen im &Feld")
MenuItem( #menu_suchN, "&Weitersuchen" + #TAB$ + "F3")
MenuTitle("S&ortieren")
MenuItem( #menu_sort, "sortieren")
MenuTitle("&Optionen")
MenuItem( #menu_titel, "Spaltennamen ändern")
MenuItem( #menu_spDel, "Spalte entfernen")
MenuItem( #menu_spIns, "Spalte anhängen")
MenuTitle("&Info")
MenuItem( #menu_info, "Info")
MenuItem( #menu_inf1, "Reihenfolge")
AddKeyboardShortcut(#window_main, #PB_Shortcut_Control|#PB_Shortcut_O , #menu_load)
AddKeyboardShortcut(#window_main, #PB_Shortcut_Control|#PB_Shortcut_S , #menu_save)
AddKeyboardShortcut(#window_main, #PB_Shortcut_Alt |#PB_Shortcut_F4, #menu_ende)
AddKeyboardShortcut(#window_main, #PB_Shortcut_Control|#PB_Shortcut_N , #menu_neu)
AddKeyboardShortcut(#window_main, #PB_Shortcut_Control|#PB_Shortcut_F , #menu_such1)
AddKeyboardShortcut(#window_main, #PB_Shortcut_F4, #menu_such1)
AddKeyboardShortcut(#window_main, #PB_Shortcut_F3, #menu_suchN)
;automatisch laden bei Start; welche Datei wird in DateiLaden() festgelegt
DateiLaden(1,1)
; Eingabeschleife--------------------------------------------
Repeat: event = WaitWindowEvent(1) ;:If event:Debug event:EndIf
Select event
Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
DatenListeResize()
Case #PB_Event_Gadget, #PB_Event_Menu
welchesgadget = EventGadget()
FeldGadgets(welchesgadget)
Select welchesgadget
Case #menu_new: DateiNeu()
Case #menu_load: DateiLaden(1)
Case #menu_load1: DateiLaden(0) ;ohne Spaltentitel
Case #menu_save: DateiSpeichern()
Case #menu_save1: DateiSpeichern(1)
Case #menu_neu: DatenNeu()
Case #menu_edit: Datenaendern()
Case #menu_kill: Datenloeschen()
Case #menu_such1: DatensuchenFirst(1) ;
Case #menu_such2: DatensuchenFirst(11) ;nach Feldern
Case #menu_suchN: DatensuchenNext()
Case #menu_sort: Datensortierenauswahl()
Case #menu_info: MessageRequester("Info", #version)
Case #menu_inf1: GetOrderArray()
Case #menu_ende: event = #PB_Event_CloseWindow
Case #main_liste: DatenListe()
Case #sort_start: DatensortierenStart()
Case #sort_ende: DatensortierenEnde()
Case #eingabe_save: EingabeOk()
Case #eingabe_ende: EingabeEnde()
Case #eingabe_leer: EingabeLeer()
Case #taste_return: TasteReturn()
Case #suchlisteEnd: DatenSuchlisteClose()
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
End
DataSection
Data_FeldNamen:
Data.i 8
Data.s "Vorname","Nachname","Plz/Ort","Strasse","Tel.","Handy","Diverses","?"
EndDataSection