Forum | | | | Andreas Koch | allô zusammen,
ici habe je quelque chose programmiert, quoi on avec bisschen gutem Willen comme Excelverschnitt appel pourrait. Grundsätzlich et prinzipiell funktioniert es déjà, hätte mais encore quelques Verbesserungen nötig. qui Spass daran hat, peux sich là oui la fois plus tour austoben. je personnelle hätte daran intérêt, comment on herausfinden peux, dans quel Spalte et la ligne sich cela Modifier le champ de avec dem Handle Getvar(0) est. j'ai là déjà alles mögliche ausprobiert, mais rien hat wirklich zuverlässig funktioniert. ensuite pourrait on cela unsichtbare Listview aussi sur cet Edits décrire (so avec Gleichheitszeichen comment chez Excel).
Schönen Salut
Andreas Koch KompilierenMarqueSéparation'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
Retour Teilformeln$[0]
ENDPROC
Fin
|
| | | | |
| | Andreas Koch | peut-être sollte je mon Frage encore la fois explizit formulieren... Kennt quelqu'un une Possibilité herauszufinden, dans quel Spalte et la ligne sich cela Modifier le champ de avec dem Handle Getvar(0) est? |
| | | | |
| | | Grüße!
exposition la fois si Dir Getvar(4) qui Spalte zurückliefert,
tu peux aussi userMessage $1405 définir et ensuite steht dans &uwParam qui Spaltennummer et dans &ulParam qui Zeilennummer.
ensuite gibt es aussi encore qui Funktion GetSelected( ... |
| | | | |
| | Thomas Freier | Hmmm. qui Ansatz ist ok, mais $H LISTVIEW.ph $H Messages.ph $H Windows.ph $I LISTVIEW_Funktionen.Inc sieht pour einem Mix de uralt Listview, Listview.dll et Gridbox aus. Im Prinzip reicht qui Listview.dll et cela Item, dans dem un simple- doppel- à gauche- à droite Klick statt fand, la hâte (peux) du avec KompilierenMarqueSéparationdéjà ermittelt.
eh bien Text(Wert) ou bien Formel pour ENTER ins gewählte Item dans LV1&, bzw., LV2&, prendre, et ggf. Neuberechnung. |
| | | | |
| | Andreas Koch | voilà tout richtig et funktioniert aussi correcte. cela Problem ist, dass cet Werte pas aktualisiert volonté, si on avec den Pfeiltasten ou bien dem tabulateur cela Item wechselt. j'ai sogar déjà une Keyhook ausprobiert et "mitgezählt", cela funktionierte mais aussi pas zuverlässig. Aussi habe je versucht mithilfe qui Position des Edits relativ zum Listview et den sichtbaren Spalten et Zeilen trop travailler, cela funktioniert mais seulement pour qui Spalte zuverlässig pas pour qui la ligne. |
| | | | |
| | Thomas Freier | je serait sur qui Pfeiltasten ou bien TAB verzichten. ItemEdit im gewähltem Item erzeugen et chez ENTER den le contenu ins Item prendre. chez Esc ou bien ItemEdit verliert den Concentrer EDIT effacer et rien prendre, sauf FormelEdit bekommt den Concentrer et soll avec Enter ou bien einem Button qui Formel übenehmen. chez Esc ou bien IFormelEdit verliert den Concentrer wieder alles jeter. Fürs ItemEdit verwende je z.B.: KompilierenMarqueSéparationClear 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 | j'ai mir qui Beispiele im Listview-paquet angesehen. cela Beispiel "Eigene_Eingaben.prf" devrait doch deinen désirer entsprechen. un Itemwechsel allez mais seulement sur qui TAB-bouton. qui Pfeiltasten, comment allgemein gültig dans einem Éditer, steuern seulement qui Curserpos. im Éditer. |
| | | | |
| | Andreas Koch | j'ai déjà pour diesem Beispiel gesucht, es mais pas trouver peut. peux du mir mitteilen, wohin je cela finde?
PS: Incidemment encore la fois merci pour eure Hilfestellung, hätte je beinahe oublier qc. |
| | | | |
| | Thomas Freier | Je mets es einmal ici un. |
| | | | |
| | Thomas Freier | un kleines Beispiel avec AddHotKey, si IsKey pas allez: KompilierenMarqueSéparationDeclare 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})")ss=s1>'Text Marque et Cursor à l' Ende
ENDPROC
si im gewählten Item dans Listview2 déjà une Formel ist, serait je vous juste im Proc INHALT ins FormelEdit mettons. Ändert qui Anwender den le contenu im Item de Listview serait je qui Formel et den le contenu des entsprechenden Item dans Listview2 effacer. |
| | | | |
|
répondreOptions du sujet | 5.712 Views |
Themeninformationencet Thema hat 3 participant: |