Foro | | | | Andreas Koch | ¡Hola zusammen,
hier Yo algo programmiert, qué con bisschen gutem Willen como Excelverschnitt llamada podría. Grundsätzlich y prinzipiell funktioniert lo ya, hätte aber todavía algunos Verbesserungen nötig. Wer Spass daran ha, kann se como sí veces más dran austoben. Yo persönlich hätte daran Interesse, cómo herausfinden kann, en welcher Spalte y Línea se el Editar campo con el Handle Getvar(0) befindet. Yo habe como ya alles mögliche ausprobiert, aber nichts ha wirklich zuverlässig funktioniert. Dann podría al unsichtbare Listview auch encima esta Edits beschreiben (así con Gleichheitszeichen como en Excel).
Schönen Saludo
Andreas Koch KompilierenMarcaSeparación'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
Volver Teilformeln$[0]
ENDPROC
End
|
| | | | |
| | Andreas Koch | Tal vez debería Yo mi Cuestión una vez más explizit formulieren... Kennt alguien una Möglichkeit herauszufinden, en welcher Spalte y Línea se el Editar campo con el Handle Getvar(0) befindet? |
| | | | |
| | | Grüße!
Schau veces si Usted Getvar(4) el Spalte zurückliefert,
Usted puede auch userMessage $1405 definieren y luego es en &uwParam el Spaltennummer y &ulParam el Zeilennummer.
Dann hay auch todavía el Función GetSelected( ... |
| | | | |
| | Thomas Freier | Hmmm. Der Ansatz es ok, aber $H LISTVIEW.ph $H Messages.ph $H Windows.ph $I LISTVIEW_Funktionen.Inc sieht una Mix de uralt Listview, Listview.dll y Gridbox de. Im Principio reicht el Listview.dll y el Item, en el una simplemente- doppel- links- rechts Clic en lugar de fand, hast (kannst) du con KompilierenMarcaSeparaciónya ermittelt.
Nun Texto(Valor) oder Formel después de ENTER en el gewählte Item en LV1&, o., LV2&, tomar, y ggf. Neuberechnung. |
| | | | |
| | Andreas Koch | Es alles correcto y funktioniert auch tadellos. Das Problema es, dass esta Werte no aktualisiert voluntad, si uno con el Pfeiltasten oder el Tabulator el Item wechselt. Yo habe incluso ya una Keyhook ausprobiert y "mitgezählt", el funktionierte aber auch no zuverlässig. Außerdem Yo intenta mithilfe el Position des Edits relativ para Listview y el sichtbaren Spalten y Zeilen a trabajo, el funktioniert aber sólo para el Spalte zuverlässig no para el Línea. |
| | | | |
| | Thomas Freier | Yo sería en el Pfeiltasten oder TAB verzichten. ItemEdit en el gewähltem Item erzeugen y en ENTER el Inhalt en el Item tomar. En Esc oder ItemEdit verliert el Focus EDIT löschen y nichts tomar, außer FormelEdit bekommt el Focus y se con Enter oder una Button el Formel übenehmen. En Esc oder IFormelEdit verliert el Focus otra vez alles descartar. Fürs ItemEdit verwende Yo z.B.: KompilierenMarcaSeparaciónClear 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 | Yo habe me el Beispiele en el Listview-Paket angesehen. Das Ejemplo "Eigene_Eingaben.prf" müßte doch deinen Wünschen entsprechen. Ein Itemwechsel va aber sólo en TAB-Taste. El Pfeiltasten, como allgemein gültig en un Editar, steuern sólo el Curserpos. en el Editar. |
| | | | |
| | Andreas Koch | Yo habe ya después de diesem Ejemplo gesucht, lo pero no encontrar puede. ¿Puede du me mitteilen, wo Yo el finde?
PS: Übrigens una vez más danke para eure Hilfestellung, hätte Yo beinahe vergessen. |
| | | | |
| | Thomas Freier | Yo lugar lo una vez hier una. |
| | | | |
| | Thomas Freier | Ein kleines Ejemplo con AddHotKey, si IsKey no va: KompilierenMarcaSeparaciónDeclare 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>'Resalte el texto y el cursor a la Ende
ENDPROC
Wenn en el gewählten Item en Listview2 ya una Formel es, sería Yo ellos igual en el Proc INHALT en el FormelEdit conjunto. Ändert el Anwender el Inhalt en el Item de Listview sería Yo el Formel y el Inhalt des entsprechenden Item en Listview2 löschen. |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 3 subscriber: |