Español
Foro

Excelverschnitt

 

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
 
22.04.2013  
 




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?
 
24.04.2013  
 



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( ...
 
24.04.2013  
 




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ón
mkey&=Getcontrolparas(CP#)
Spalte&=Long(CP#,4)
Zeile&=Long(CP#,8)re>
ya ermittelt.

Nun Texto(Valor) oder Formel después de ENTER en el gewählte Item en LV1&, o., LV2&, tomar, y ggf. Neuberechnung.
 
Gruß Thomas
Windows XP SP2, XProfan X2
24.04.2013  
 




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.
 
24.04.2013  
 




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ón
Clear 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&))       ................
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 




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.
 
25.04.2013  
 




Thomas
Freier
Yo lugar lo una vez hier una.

11 kB
Hochgeladen:25.04.2013
Ladeanzahl96
Descargar
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 




Thomas
Freier
Ein kleines Ejemplo con AddHotKey, si IsKey no va:
KompilierenMarcaSeparación
Declare 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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 



Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

5.697 Views

Untitledvor 0 min.
H.Brill15.11.2023
Michael Hettner27.08.2021
rquindt10.05.2016
Christof Neuß17.03.2016
Más...

Themeninformationen

Dieses Thema ha 3 subscriber:

Thomas Freier (5x)
Andreas Koch (4x)
iF (1x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie