Deutsch
Forum

Excelverschnitt

 

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
 
22.04.2013  
 




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



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




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

Nun Text(Wert) oder Formel nach ENTER ins gewählte Item in LV1&, bzw., LV2&, übernehmen, und ggf. Neuberechnung.
 
Gruß Thomas
Windows XP SP2, XProfan X2
24.04.2013  
 




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




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




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




Thomas
Freier
Ich stelle es einmal hier ein.

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




Thomas
Freier
Ein kleines Beispiel mit AddHotKey, falls IsKey nicht geht:
KompilierenMarkierenSeparieren
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})")'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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

5.722 Betrachtungen

Unbenanntvor 0 min.
H.Brill15.11.2023
Michael Hettner27.08.2021
rquindt10.05.2016
Christof Neuß17.03.2016
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

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


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie