Forum | | | | Andreas Koch | Hallo zusammen,
hier habe ich etwas programmiert, was man mit bisschen gutem Willen als Excelverschnitt bezeichnen könnte. Grundsätzlich und prinzipiell funktioniert es schon, hätte aber noch einige Verbesserungen nötig. Wer Spass daran hat, kann sich da ja mal weiter dran austoben. Ich persönlich hätte daran Interesse, wie man herausfinden kann, in welcher Spalte und Zeile sich das Editfeld mit dem Handle Getvar(0) befindet. Ich habe da schon alles mögliche ausprobiert, aber nichts hat wirklich zuverlässig funktioniert. Dann könnte man das unsichtbare Listview auch über diese Edits beschreiben (so mit Gleichheitszeichen wie bei Excel).
Schönen Gruß
Andreas Koch KompilierenMarkierenSeparieren'Programmaufbau: 2 Listviews gleicher Größe, ein sichtbares und ein unsichtbares. Über einen Rechtsklick kann man im Editfeld die unsichtbare Listview beschreiben (der Text wird erst eingebracht, wenn das Editfeld mit Return verlassen wird),
'mit einem linken Doppelklick wird das sichtbare Listview beschrieben. Aktualisieren läuft über das unsichtbare Listview und setzt den berechneten Wert in die sichtbare Listview ein.
'Aktualisiert wird nach dem Editieren von jeder der beiden Listviews. Man kann Verlinkungen in die unsichtbare Listview einfügen: Syntax (z.B.: $C 1$, $A 2$+$D 3$....)
'Berechnet werden können +,-,*,/,Potenzen und Klammern.
$H LISTVIEW.ph
$H Messages.ph
$H Windows.ph
$I LISTVIEW_Funktionen.Inc
$I User.Inc
VAR LVDLL& = UseDll("Listview.dll")
@Set("ListDel", "|")
Set("Decimals",2)
WindowStyle 512
Window 0,0-%maxx,%maxy
Declare ende%, Text#, Editable#,Bereich#, CP#, mkey&,Text$, Edit&, Zeile&, Spalte&
Declare Formeledit&, Aktualisieren&, sp_max&, z_max&
Dim CP#, 320
dim Editable#,64
Dim Bereich#,16
Dim Text#,256
var LV1&= CREATELISTVIEW(%hwnd, %HINSTANCE, 0, MixRGBs(~GetSysColor(24),$00ffffffff), -1, $21)
var LV2&= CREATELISTVIEW(%hwnd, %HINSTANCE, 0, MixRGBs(~GetSysColor(24),$00ffffffff), -1, $21)
Formeledit&=Create("Edit",%hwnd,"",%maxx*0.01, %maxy*0.01, %maxx*0.98, %maxy*0.03)
IColumn(LV1&,0,30,2)
IColumn(LV2&,0,30,2)
WhileLoop 63
if &loop<=24
Text$=Chr$(64+&Loop)
ElseIf &loop<=48
Text$="A"+Chr$(64+&Loop-24)
ElseIf &loop<=72
Text$="B"+Chr$(64+&Loop-48)
EndIf
IColumn(LV1&,ADDR(Text$),60,2)
IColumn(LV2&,ADDR(Text$),60,2)
Byte Editable#,&loop=1
EndWhile
EnableEdits(LV1&,7)
SelectColumnEdits(LV1&,Editable#)
EnableEdits(LV2&,7)
SelectColumnEdits(LV2&,Editable#)
WhileLoop 150
AddString(LV1&,Str$(&loop))
AddString(LV2&,Str$(&loop))
EndWhile
ShowListview(LV1&, %maxx*0.01, %maxy*0.15, %maxx*0.98, %maxy*0.78)
InitMessages(%hwnd)
WhileNot Ende%
If Aktualisieren&
WhileLoop sp_max&
Spalte&=&loop
WhileLoop 0,z_max&
Zeile&=&Loop
Getitemtext(LV2&,Text#,Spalte&, Zeile&)
Text$=String$(Text#,0)
Text$=Itemrechner(Text$)
If Val(Text$)=Int(Val(Text$))
Text$=SubStr$(Text$,1,".")
Else
Text$=Translate$(Text$,".",",")
EndIf
If Text$<>""
Setitemtext(LV1&,Addr(Text$),Spalte&, Zeile&)
EndIf
EndWhile
EndWhile
Aktualisieren&=0
EndIf
WaitInput
If %key=2
Ende%=1
EndIf
mkey&=Getcontrolparas(CP#)
If Mkey&=2
Spalte&=Long(CP#,4)
Zeile&=Long(CP#,8)
If Spalte&>sp_max&
sp_max&=Spalte&
EndIf
If Zeile&>z_max&
z_max&=Zeile&
EndIf
Getitemtext(LV2&,Text#,Spalte&,Zeile&)
SetText Formeledit&,String$(Text#,0)
SetFocus(Formeledit&)
EndIf
While Getvar(0)
Aktualisieren&=1
EndWhile
If (GetText$(Formeledit&)<>"") And ~GetAsyncKeyState($0D)
Text$=GetText$(Formeledit&)
Setitemtext(LV2&,Addr(Text$),Spalte&,Zeile&)
SetText Formeledit&,""
Text$=Itemrechner(Text$)
Text$=Translate$(Text$,".",",")
Setitemtext(LV1&,Addr(Text$),Spalte&, Zeile&)
Aktualisieren&=1
EndIf
EndWhile
CloseMessages(%hwnd)
FreeDLL LVDLL&
Proc Itemrechner
Parameters Formel$
Declare Teilformeln$[], Sizeteilformel%, Formel#, Stufe%, Schreibmodus%, Stufen_Nr%,Platzhalter$, Lastschreibmodus%, Check%, Size%, aux$, Zahlen![], Operatoren$[],LoopEnde%, Ans!,Check%[]
Declare Spalte$, Zeile$, N1$, N2$, Spalte&, Zeile&, Text#
Dim Text#,256
Formel$=Translate$(Formel$,",",".")
WhileNot SubStr$(SubStr$(Formel$,2,"$"),1," ")=""
Spalte$=SubStr$(SubStr$(Formel$,2,"$"),1," ")
Zeile$=SubStr$(SubStr$(Formel$,2,"$"),2," ")
If SizeOf(Spalte$)=1
Spalte&=Ord(Spalte$)-64
ElseIf SizeOf(Spalte$)=2
Spalte&=(Ord(Spalte$)-64)*24+Ord(SubStr$(Spalte$,2))-64
EndIf
Zeile&=Val(Zeile$)-1
Getitemtext(LV2&, Text#, Spalte&, Zeile&)
If String$(Text#,0)=""
Getitemtext(LV1&, Text#, Spalte&, Zeile&)
EndIf
Formel$=Translate$(Formel$,"$"+Spalte$+" "+Zeile$+"$",Itemrechner(String$(Text#,0)))
EndWhile
'
SetSize Teilformeln$[],Len(Formel$,"(")+1
Teilformeln$[0]=Formel$
Size%=0
whileloop 0,SizeOf(Teilformeln$[])-2,1
Stufe%=&loop
Stufen_Nr%=Stufe%
aux$=Teilformeln$[Stufe%]
WhileLoop SizeOf(aux$)
check%=1
Lastschreibmodus%=Schreibmodus%
if SubStr$(aux$,&loop)="("
Inc Schreibmodus%
ElseIf SubStr$(aux$,&loop)=")"
Dec Schreibmodus%
EndIf
if (Schreibmodus%=1) And (Lastschreibmodus%=0)
Inc Size%
Stufen_Nr%=Size%
Platzhalter$="§"+Str$(Stufen_Nr%)
check%=0
ElseIf (Schreibmodus%=0) And (Lastschreibmodus%=1)
Stufen_Nr%=Stufe%
Teilformeln$[Stufen_Nr%]=Translate$(Teilformeln$[Stufen_Nr%],"("+Teilformeln$[Size%]+")",Platzhalter$)
check%=0
EndIf
If (Stufen_Nr%<>Stufe%) And check%
Teilformeln$[Stufen_Nr%]=Teilformeln$[Stufen_Nr%]+SubStr$(aux$,&loop)
EndIf
EndWhile
EndWhile
WhileLoop SizeOf(Teilformeln$[])-2,0,-1
aux$=""
Stufe%=&loop
Clear Operatoren$[], Zahlen![]
WhileLoop SizeOf(Teilformeln$[&loop])
If (SubStr$(Teilformeln$[Stufe%],&loop)="+") Or (SubStr$(Teilformeln$[Stufe%],&loop)="-") Or (SubStr$(Teilformeln$[Stufe%],&loop)="*") Or (SubStr$(Teilformeln$[Stufe%],&loop)="/") Or (SubStr$(Teilformeln$[Stufe%],&loop)="^")
Operatoren$[SizeOf(Operatoren$[])]=SubStr$(Teilformeln$[Stufe%],&loop)
if SubStr$(aux$,2,"§")<>""
Zahlen![SizeOf(Zahlen![])]=Val(Teilformeln$[val(SubStr$(aux$,2,"§"))])
Else
Zahlen![SizeOf(Zahlen![])]=Val(aux$)
EndIf
aux$=""
Else
aux$=aux$+SubStr$(Teilformeln$[Stufe%],&loop)
EndIf
EndWhile
if SubStr$(aux$,2,"§")<>""
Zahlen![SizeOf(Zahlen![])]=Val(Teilformeln$[val(SubStr$(aux$,2,"§"))])
Else
Zahlen![SizeOf(Zahlen![])]=Val(aux$)
EndIf
Size%=SizeOf(Zahlen![])
WhileNot Size%=1
Calculate
EndWhile
Teilformeln$[&loop]=str$(Zahlen![0])
EndWhile
Proc Calculate
Declare aux$[], aux![], Operator%,Check%
Check%=1
WhileLoop 0,SizeOf(Operatoren$[])-1,1
Operator%=&loop
If Operatoren$[&loop]="^"
Ausrechnen(&loop)
Check%=0
BREAK
EndIf
EndWhile
If Check%
WhileLoop 0,SizeOf(Operatoren$[])-1,1
If (Operatoren$[&loop]="*") or (Operatoren$[&loop]="/")
Check%=0
Ausrechnen(&loop)
BREAK
EndIf
EndWhile
EndIf
If Check%
WhileLoop 0,SizeOf(Operatoren$[])-1,1
If (Operatoren$[&loop]="+") or (Operatoren$[&loop]="-")
Ausrechnen(&loop)
BREAK
EndIf
EndWhile
EndIf
EndProc
Proc Ausrechnen
Parameters Item&
Declare Ans!
If Operatoren$[Item&]="^"
Ans!=Zahlen![Item&]^(Zahlen![Item&+1])
ElseIf Operatoren$[Item&]="*"
Ans!=Zahlen![Item&]*(Zahlen![Item&+1])
ElseIf Operatoren$[Item&]="/"
Ans!=Zahlen![Item&]/(Zahlen![Item&+1])
ElseIf Operatoren$[Item&]="+"
Ans!=Zahlen![Item&]+(Zahlen![Item&+1])
ElseIf Operatoren$[Item&]="-"
Ans!=Zahlen![Item&]-(Zahlen![Item&+1])
EndIf
Zahlen![Item&+1]=Ans!
WhileLoop 0,SizeOf(Zahlen![])-1,1
If &loop<Item&
aux![&loop]=Zahlen![&loop]
Elseif &loop>Item&
aux![&loop-1]=Zahlen![&loop]
EndIf
EndWhile
WhileLoop 0,SizeOf(Operatoren$[])-1,1
If &loop<Item&
aux$[&loop]=Operatoren$[&loop]
Elseif &loop>Item&
aux$[&loop-1]=Operatoren$[&loop]
EndIf
EndWhile
Clear Operatoren$[], Zahlen![]
SetSize Operatoren$[],SizeOf(aux$[])
SetSize Zahlen![],SizeOf(aux![])
Size%=SizeOf(Zahlen![])
WhileLoop 0,SizeOf(aux$[])-1,1
Operatoren$[&loop]=aux$[&loop]
EndWhile
WhileLoop 0,SizeOf(aux![])-1,1
Zahlen![&loop]=aux![&loop]
EndWhile
EndProc
Return Teilformeln$[0]
EndProc
End
|
| | | | |
| | Andreas Koch | Vielleicht sollte ich meine Frage noch mal explizit formulieren... Kennt jemand eine Möglichkeit herauszufinden, in welcher Spalte und Zeile sich das Editfeld mit dem Handle Getvar(0) befindet? |
| | | | |
| | | Grüße!
Schau mal ob Dir Getvar(4) die Spalte zurückliefert,
Du kannst auch userMessage $1405 definieren und dann steht in &uwParam die Spaltennummer und in &ulParam die Zeilennummer.
Dann gibt es auch noch die Funktion GetSelected( ... |
| | | | |
| | Thomas Freier | Hmmm. Der Ansatz ist ok, aber $H LISTVIEW.ph $H Messages.ph $H Windows.ph $I LISTVIEW_Funktionen.Inc sieht nach einem Mix von uralt Listview, Listview.dll und Gridbox aus. Im Prinzip reicht die Listview.dll und das Item, in dem ein einfach- doppel- links- rechts Klick statt fand, hast (kannst) du mit KompilierenMarkierenSeparierenschon ermittelt.
Nun Text(Wert) oder Formel nach ENTER ins gewählte Item in LV1&, bzw., LV2&, übernehmen, und ggf. Neuberechnung. |
| | | | |
| | Andreas Koch | Das ist alles richtig und funktioniert auch tadellos. Das Problem ist, dass diese Werte nicht aktualisiert werden, wenn man mit den Pfeiltasten oder dem Tabulator das Item wechselt. Ich habe sogar schon einen Keyhook ausprobiert und "mitgezählt", das funktionierte aber auch nicht zuverlässig. Außerdem habe ich versucht mithilfe der Position des Edits relativ zum Listview und den sichtbaren Spalten und Zeilen zu arbeiten, das funktioniert aber nur für die Spalte zuverlässig nicht für die Zeile. |
| | | | |
| | Thomas Freier | Ich würde auf die Pfeiltasten oder TAB verzichten. ItemEdit im gewähltem Item erzeugen und bei ENTER den Inhalt ins Item übernehmen. Bei Esc oder ItemEdit verliert den Focus EDIT löschen und nichts übernehmen, außer FormelEdit bekommt den Focus und soll mit Enter oder einem Button die Formel übenehmen. Bei Esc oder IFormelEdit verliert den Focus wieder alles verwerfen. Fürs ItemEdit verwende ich z.B.: KompilierenMarkierenSeparierenClear bereich1#
a$=trim$(GetText$(FAHRTEN_FLLV&,Zeile&,Spalte&))'alter Inhalt
GetOwnControlParas(bereich1#,FAHRTEN_FLLV&,Spalte&,Zeile&)
op.x&=Long(bereich1#,12)'X Offset
op.y&=Long(bereich1#,16)'Y Offset
op.b&=Long(bereich1#,20)'Breite
op.h&=Long(bereich1#,24)'Höhe
Var Ede_del2&= @Create("Edit", FAHRTEN_FLLV& ,"",0,0,op.b&,op.h&)
SetWindowPos Ede_del2&=op.x&,op.y&
settext Ede_del2&,a$
Var _del1& = @Create("Tooltip", %hWnd , FAHRTEN_FLLV& ,"Esc=Abbruch, Wert mit Enter übernehmen.")
SetFont _del1&,d_Font&
Setfocus(Ede_del2&)
While 1
WaitInput
case iskey(27):BREAK'Abbruch ESC
Ifnot getfocus(Ede_del2&)
' hier würde ich ins FormelEdit springen
BREAK
EndIf
If iskey(13)'Speichern Enter gedrückt
SetText FAHRTEN_FLLV&,Zeile&,Spalte&,trim$(GetText$(Ede_del2&))
................
|
| | | | |
| | Thomas Freier | Ich habe mir die Beispiele im Listview-Paket angesehen. Das Beispiel "Eigene_Eingaben.prf" müßte doch deinen Wünschen entsprechen. Ein Itemwechsel geht aber nur über die TAB-Taste. Die Pfeiltasten, wie allgemein gültig in einem Edit, steuern nur die Curserpos. im Edit. |
| | | | |
| | Andreas Koch | Ich habe schon nach diesem Beispiel gesucht, es aber nicht finden können. Kannst du mir mitteilen, wo ich das finde?
PS: Übrigens noch mal danke für eure Hilfestellung, hätte ich beinahe vergessen. |
| | | | |
| | Thomas Freier | Ich stelle es einmal hier ein. |
| | | | |
| | Thomas Freier | Ein kleines Beispiel mit AddHotKey, falls IsKey nicht geht: KompilierenMarkierenSeparierenDeclare bereich#,lvdll&,text$,x&,y&,z&,listview&
Def GetSysColor(1) !"USER32","GetSysColor"
Dim bereich#,256
var Font& = @CREATE("FONT","NEW TIMES ROMAN",14,0,0,0,0)
$I Listview_Funktionen.inc
lvdll&=usedll("Listview.dll")
SetTrueColor 1
Window 0,0-400,400
Cls GetSysColor(15)
listview&=CreateListView(%hwnd,%hinstance,0,GetSysColor(24),-1,$31)
text$="A,B,C"
SetColumnsFromMem(listview&,addr(text$),0)
SetFont listview&,Font&
Whileloop 5
SetItem listview&,"","",""
EndWhile
SetColumnWidth(listview&,0,100)
SetColumnWidth(listview&,1,100)
SetColumnWidth(listview&,2,100)
ShowListView(listview&,10,48,354,270)
CreateText(%hwnd,"Formel",10,8,60,22)
var FormelEdit%=CreateEdit(%hwnd,"=4+6",80,10,120,22)
var Formel_zul%=CreateButton(%hwnd,"Übernehmen",240,10,100,22)
InitMessages(%hwnd)
usermessages $1407
AddHotKey 7001, 13, 0'Return
AddHotKey 7002, 9, 0'Links
AddHotKey 7003, 9, 2'Rechts
While 1
waitinput
Case %key=2:BREAK
case %umessage=$1407: EDIT &uwParam, &ulParam'Spaltenindex ,'Zeilenindex (nullbasierend)
Wend
CloseMessages(%hwnd)
freedll lvdll&
End
Proc Edit
Parameters spalte%,zeile%
Declare Ede_del2&,op.x&,op.y&
INHALT
@Create("Tooltip", %hWnd , Listview& ,"Esc=Abbruch, Wert mit Enter übernehmen.")
Setfocus(Ede_del2&)
While 1
WaitInput
case iskey(27):BREAK'Abbruch ESC
Ifnot getfocus(Ede_del2&)
SetText Listview&,Zeile%,Spalte%,trim$(GetText$(Ede_del2&))
If Getfocus(FormelEdit%)
'aus 2. Listview vorhandene Formel ins FormelEdit% und Curser ans Ende
'SetText FormelEdit%,trim$(GetText$(Listview2&,Zeile%,Spalte%))'alter Inhalt
DestroyWindow(Ede_del2&)
while 1
waitinput
case iskey(27):BREAK
If getfocus(Formel_zul%)
' Formel ins 2. Listview
' Wert berechnen und ins 1.Listview
SetText Listview&,Zeile%,Spalte%,"10,00"
BREAK
EndIf
wend
SetText FormelEdit%,""
endif
BREAK
ElseIf MenuItem(7001)'Speichern Enter gedrückt
SetText Listview&,Zeile%,Spalte%,trim$(GetText$(Ede_del2&))
BREAK
ElseIf MenuItem(7002)'TAB vor
SetText Listview&,Zeile%,Spalte%,trim$(GetText$(Ede_del2&))
case Spalte%<GetColumns(Listview&)-1: inc Spalte%
INHALT
ElseIf MenuItem(7003)'TAB rück
SetText Listview&,Zeile%,Spalte%,trim$(GetText$(Ede_del2&))
case Spalte%>0 : dec Spalte%
INHALT
EndIf
wend
DestroyWindow(Ede_del2&)
setfocus(%hwnd)
EndProc
Proc Inhalt
DestroyWindow(Ede_del2&)
Clear bereich#
Text$=trim$(GetText$(Listview&,Zeile%,Spalte%))'alter Inhalt
GetOwnControlParas(bereich#,Listview&,Spalte%,Zeile%)
op.x&=Long(bereich#,12)'X Offset
op.y&=Long(bereich#,16)'Y Offset
var op.b&=Long(bereich#,20)'Breite
var op.h&=Long(bereich#,24)'Höhe
Ede_del2&= @Create("Edit", Listview& ,Text$,op.x&,op.y&,op.b&,op.h&)
SetFont Ede_del2&,Font&
Setfocus(Ede_del2&)
SendString(Ede_del2&,"+({END})")'Text Markieren und Cursor ans Ende
Endproc
Wenn im gewählten Item in Listview2 schon eine Formel ist, würde ich sie gleich im Proc INHALT ins FormelEdit setzen. Ändert der Anwender den Inhalt im Item von Listview würde ich die Formel und den Inhalt des entsprechenden Item in Listview2 löschen. |
| | | | |
|
AntwortenThemenoptionen | 5.722 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |