Français
Forum

Excelverschnitt

 

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
 
22.04.2013  
 




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



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




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éparation
mkey&=Getcontrolparas(CP#)
Spalte&=Long(CP#,4)
Zeile&=Long(CP#,8)re>
déjà ermittelt.

eh bien Text(Wert) ou bien Formel pour ENTER ins gewählte Item dans LV1&, bzw., LV2&, prendre, et ggf. Neuberechnung.
 
Gruß Thomas
Windows XP SP2, XProfan X2
24.04.2013  
 




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




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




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




Thomas
Freier
Je mets es einmal ici un.

11 kB
Hochgeladen:25.04.2013
Downloadcounter96
Download
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 




Thomas
Freier
un kleines Beispiel avec AddHotKey, si IsKey pas allez:
KompilierenMarqueSéparation
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>'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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.04.2013  
 



répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

5.712 Views

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

Themeninformationen

cet Thema hat 3 participant:

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


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie