Deutsch
Forum

Listbox/Gridbox Einträge editieren

 

Christof
Neuß
Hallo,

als Front-End für Datenbankanwendungen eignet sich eben oft ein Browse-Fenster. Dabei können die Daten direkt in einer Art Tabelle (z.B. Gridbox) angezeigt und bearbeitet werden.

Die Dialoge "Listbox" und "Gridbox" aus XProfan wären eigentlich prädestiniert, dieses zu leisten. Leider gibt es keine (einfache) Möglichkeit, die Einträge direkt zu editieren.

Ich weiß, dass es z.B. mit der Listview.dll geht. Damit habe ich auch schon experimentiert. Da ich aber möglichst wenige/keine externen DLLs nutzen möchte, wäre eine Lösung mit "Bordmitteln" genial.

Hat eigentlich mal jemand diesen Ansatz hier weiterverfolgt?
Source wurde am 15.07.2007 aus der MMJ-Quellcodesammlung (Dietmar Horn) in die Babyklappe auf XProfan.Com abgelegt:
Listboxeinträge editieren
Lauffähig ab Profan-Version 5.0
********************** HINWEISE ********************************
CODE ERZEUGT MIT ROKOS OBJECT CREATOR 2.8c
DATUM  31.01.2003    um  22:33 Uhr
VERWENDETE PROFANVERSION IST 7.0 ODER HÖHER
NUR FÜR UNSORTIERTE LISTBOX GÜLTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Def GetSysColor(1) !USER32,GetSysColor
SETTRUECOLOR 1
DECLARE ENDE%,editfeld%,top%
DECLARE LISTBOX1%,font%,font2%,Text%
DECLARE BUTTON1%,listindex%,gtext$
font%=@CREATE(FONT,MS Sans Serif,13,0,0,0,0)
WINDOWSTYLE 63
WINDOWTITLE EDITLISTBOX (c) by Rolf Koch 2003
WINDOW 214,134-429,218
CLS GETSYSCOLOR(15)
USEFONT MS Sans Serif,8,0,0,0,0
SETDIALOGFONT 1
LISTBOX1% = CREATE(LISTBOX,%HWND,LISTBOX1,0012,0013,0401,0107)
TEXT% = CREATE(TEXT,%HWND,Bitte Eintrag anklicken und editieren - Mauszeiger muss während der Eingabe in der Listbox bleiben!,0012,0123,0400,040)
BUTTON1% = CREATE(BUTTON,%HWND,Good by,0091,0150,0228,0033)
EDITFELD%=@Control(EDIT,,$54010000,0,0,0,0,listbox1%,1000,%HINSTANCE)
setfont editfeld%,font%
clearlist
addstring(listbox1%,Test1 der Listbox)
addstring(listbox1%,Test2 der Listbox)
addstring(listbox1%,Test3 der Listbox)
addstring(listbox1%,Test4 der Listbox)
addstring(listbox1%,Test5 der Listbox)
addstring(listbox1%,Test6 der Listbox)
addstring(listbox1%,Test7 der Listbox)
addstring(listbox1%,Test8 der Listbox)
addstring(listbox1%,Test9 der Listbox)
addstring(listbox1%,Test10 der Listbox)
addstring(listbox1%,Test11 der Listbox)
addstring(listbox1%,Test12 der Listbox)
addstring(listbox1%,Test13 der Listbox)
addstring(listbox1%,Test14 der Listbox)
addstring(listbox1%,Test15 der Listbox)
addstring(listbox1%,Test16 der Listbox)
addstring(listbox1%,Test17 der Listbox)
addstring(listbox1%,Test18 der Listbox)
addstring(listbox1%,Test19 der Listbox)
addstring(listbox1%,Test20 der Listbox)
addstring(listbox1%,Test21 der Listbox)
addstring(listbox1%,Test22 der Listbox)
addstring(listbox1%,Test23 der Listbox)
addstring(listbox1%,Test24 der Listbox)
addstring(listbox1%,Test25 der Listbox)

WHILENOT ENDE%

    WAITINPUT

    If @EQU(%KEY,2)

        LET ENDE%= 1

    ELSEIF GETFOCUS(LISTBOX1%) LISTBOX

        listindex%=@GetCursel(listbox1%)

        ifnot lt(listindex%,0)

            Top%=@SendMessage(Listbox1%,398,0,0)
            @SendMessage(listbox1%,$0186,-1,0)
            settext editfeld%,@GetString$(listbox1%,listindex%)
            setwindowpos Editfeld%=2,mul(sub(listindex%,top%),13)-430,13;0
            setfocus(editfeld%)
            sendmessage(editfeld%,$00B1,add(len(gettext$(editfeld%)),1),-1)

            WHILE GETFOCUS(editfeld%) DUMMYSCHLEIFE

                getmessage

                if equ(%message,160)

                    setfocus(%hwnd)

                endif

            WEND

            GTEXT$=gettext$(editfeld%)
            @DeleteString(Listbox1%,listindex%)
            @InsertString(Listbox1%,listindex%,gtext$)
            setwindowpos Editfeld%=0,0-0,0;0
            setwindowpos listbox1%=0012,0013-0401,0107;0

        endif

    ELSEIF GETFOCUS(BUTTON1%) BUTTON

        LET ENDE%=1

    ENDIF

WEND

Deleteobject font%

Oder hat jemand eine andere Idee, wie man einen Datenbrowser mit Editiermöglichkeit realisieren könnte?

Bin gespannt und für jeden Hinweis dankbar.

Vielen Dank und viele Grüße

Christof
 
XProfan X3
Win10 16 GB RAM
18.10.2016  
 




Michael
W.
Hatte ich bisher nicht gebraucht, aber das sieht gut aus.

Hier mal lauffähig eingestellt, da Apostroph (Kommentar) und Anführungszeichen durch einen kleinen Unfall abhanden kamen.
Auch die Vergleiche habe ich durch die Operatoren ersetzt.
'Source wurde am 15.07.2007 aus der MMJ-Quellcodesammlung (Dietmar Horn) in die Babyklappe auf XProfan.Com abgelegt:
'Listboxeinträge editieren
'Lauffähig ab Profan-Version 5.0
'********************** HINWEISE ********************************
'CODE ERZEUGT MIT ROKOS OBJECT CREATOR 2.8c
'DATUM  31.01.2003    um  22:33 Uhr
'VERWENDETE PROFANVERSION IST 7.0 ODER HÖHER
'NUR FÜR UNSORTIERTE LISTBOX GÜLTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Def GetSysColor(1) !"USER32","GetSysColor"
SETTRUECOLOR 1
DECLARE ENDE%, editfeld%, top%
DECLARE LISTBOX1%, font%, font2%, Text%
DECLARE BUTTON1%, listindex%, gtext$
font% = @CREATE("FONT","MS Sans Serif",13,0,0,0,0)
WINDOWSTYLE 63
WINDOWTITLE "EDITLISTBOX (c) by Rolf Koch 2003"
WINDOW 214,134 - 429,218
CLS GETSYSCOLOR(15)
USEFONT "MS Sans Serif",8,0,0,0,0
SETDIALOGFONT 1
LISTBOX1% = CREATE("LISTBOX",%HWND,"LISTBOX1",0012,0013,0401,0107)
TEXT% = CREATE("TEXT",%HWND,"Bitte Eintrag anklicken und editieren - Mauszeiger muss während der Eingabe in der Listbox bleiben!",0012,0123,0400,040)
BUTTON1% = CREATE("BUTTON",%HWND,"Good by",0091,0150,0228,0033)
EDITFELD% = @Control("EDIT","",$54010000,0,0,0,0,listbox1%,1000,%HINSTANCE)
setfont editfeld%,font%
clearlist
addstring(listbox1%,"Test1 der Listbox")
addstring(listbox1%,"Test2 der Listbox")
addstring(listbox1%,"Test3 der Listbox")
addstring(listbox1%,"Test4 der Listbox")
addstring(listbox1%,"Test5 der Listbox")
addstring(listbox1%,"Test6 der Listbox")
addstring(listbox1%,"Test7 der Listbox")
addstring(listbox1%,"Test8 der Listbox")
addstring(listbox1%,"Test9 der Listbox")
addstring(listbox1%,"Test10 der Listbox")
addstring(listbox1%,"Test11 der Listbox")
addstring(listbox1%,"Test12 der Listbox")
addstring(listbox1%,"Test13 der Listbox")
addstring(listbox1%,"Test14 der Listbox")
addstring(listbox1%,"Test15 der Listbox")
addstring(listbox1%,"Test16 der Listbox")
addstring(listbox1%,"Test17 der Listbox")
addstring(listbox1%,"Test18 der Listbox")
addstring(listbox1%,"Test19 der Listbox")
addstring(listbox1%,"Test20 der Listbox")
addstring(listbox1%,"Test21 der Listbox")
addstring(listbox1%,"Test22 der Listbox")
addstring(listbox1%,"Test23 der Listbox")
addstring(listbox1%,"Test24 der Listbox")
addstring(listbox1%,"Test25 der Listbox")

WHILENOT ENDE%

    WAITINPUT

    If (%KEY = 2)

        LET ENDE% = 1

    ELSEIF GETFOCUS(LISTBOX1%)'LISTBOX

        listindex% = @GetCursel(listbox1%)

        ifnot (listindex% < 0)

            Top% = @SendMessage(Listbox1%,398,0,0)
            @SendMessage(listbox1%,$0186,-1,0)
            settext editfeld%,@GetString$(listbox1%,listindex%)
            setwindowpos Editfeld% = 2,((listindex% - top%) * 13) - 430,13; 0
            setfocus(editfeld%)
            sendmessage(editfeld%,$00B1,(len(gettext$(editfeld%)) + 1), -1)

            WHILE GETFOCUS(editfeld%)'DUMMYSCHLEIFE

                getmessage

                if (%message = 160)

                    setfocus(%hwnd)

                endif

            WEND

            GTEXT$ = gettext$(editfeld%)
            @DeleteString(Listbox1%,listindex%)
            @InsertString(Listbox1%,listindex%,gtext$)
            setwindowpos Editfeld% = 0,0 - 0,0;0
            setwindowpos listbox1% = 0012,0013 - 0401,0107;0

        endif

    ELSEIF GETFOCUS(BUTTON1%)'BUTTON

        LET ENDE% = 1

    ENDIF

WEND

Deleteobject font%
 
Alle Sprachen
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
18.10.2016  
 




Thomas
Freier
Ansatz mal verfolgt. Die Edit-Position muß aber für das verwendete WIN angepaßt werden (im Moment für WIN7). Ein Beispiel, dass ich noch verwende.
 $H windows.ph
 $H messages.ph
 $H commctrl.ph
WindowStyle 16+512
Window 600,410
WindowTitle "Volumen, Schwerpunkt, ...."
cls ~GetSysColor(15)
Set("Decimals",2)
Declare Ende%,x&,x%,x!,x$,y&,y%,y!
Declare Item&,Wert&,Teil_L&
var LV_F&=CreateFont("Verdana",16,0,0,0,0)
SetDialogFont LV_F&
x$="Werte in der Tabelle nach Doppellinksklick eingeben.\n"
x$=x$+"Fläche geht vor a*b.\n"
x$=x$+"Fläche, bzw. a*b geht vor Radius.\n"
x$=x$+"Radius und Fläche, bzw. a*b führt zu abgerundeten Kanten.\n"
x$=x$+"Wird zur Fläche ein Radius eingegeben, wird die Ursprungsfläche verändert.\n"
Create("Tooltip",%hwnd,%hwnd,x$)
CreateText(%hwnd,"Abschnitte",10,60,70,22)
CreateText(%hwnd,"Länge",100,10,70,22)
CreateText(%hwnd,"Teil-Länge",100,60,70,22)
CreateText(%hwnd,"spez. Gew.",10,10,90,22)
var LV1&=Create("GridBox", %hwnd,"Inhalt;0;160;Wert;1;120",0,280,10,300,90)
setstyle Lv1&,getstyle(Lv1&) | ~LVS_NOCOLUMNHEADER
SetFont LV1&,LV_F&
Addstring(LV1&,"Volumen|0")
Addstring(LV1&,"Schwerpunkt von 0|0")
Addstring(LV1&,"Gewicht|0")
Addstring(LV1&,"Moment|0")
var Teile%=4
var Teile&=CreateText(%hwnd,"4",12,82,20,22)
var plus& = Create("Button",%hwnd,"+",33,80,22,22)
var minus& = Create("Button",%hwnd,"-",56,80,22,22)
var Spez& = Create("Edit",%hwnd,"1",10,30,70,22)
sendmessage(Spez&,$00C5,7,0)
var Abst& = Create("Edit",%hwnd,"1",100,30,70,22)
sendmessage(Abst&,$00C5,7,0)
Teil_L&=CreateText(%hwnd,str$(val(gettext$(Abst&))/Teile%),100,82,70,22)
Create("GroupBox",%hwnd,"zu Null",480,114,100,140)
var Neu1&=Create("Button",%hwnd,"Fläche",490,140,80,22)
var Neu2&=Create("Button",%hwnd,"Seite-a",490,164,80,22)
var Neu3&=Create("Button",%hwnd,"Seite-b",490,188,80,22)
var Neu4&=Create("Button",%hwnd,"Radius",490,212,80,22)
var Ende&=Create("Button",%hwnd,"ENDE",480,340,100,22)
var Rechne&=Create("Button",%hwnd,"Rechne",480,316,100,22)
var LV&=Create("GridBox", %hwnd,"x;1;0;Pos.;1;60;Fläche;1;120;Seite-a;1;80;Seite-b;1;80;Radius;1;80",0,10,110,460,250)
Addstring(LV&,"0.5|0|0|0|0|0")
Addstring(LV&,"2|1|0|0|0|0")
Addstring(LV&,"1|2|0|0|0|0")
Addstring(LV&,"2|3|0|0|0|0")
Addstring(LV&,"0.5|4|0|0|0|0")
SetFont LV&,LV_F&
SubClass %hwnd, 1
UserMessages 2000

WhileNot Ende%

    WaitInput
    case Clicked(Ende&): Ende% = 1
    case getfocus(Abst&) : NUMWERT Abst&, 3
    case getfocus(Spez&) : NUMWERT Spez&, 3
    case getfocus(Rechne&) : RECHNE
    case getfocus(Neu1&) : ITEM_LEER 2
    case getfocus(Neu2&) : ITEM_LEER 3
    case getfocus(Neu3&) : ITEM_LEER 4
    case getfocus(Neu4&) : ITEM_LEER 5
    settext Teil_L&,str$(val(gettext$(Abst&))/Teile%)

    If (%umessage = 2000) AND (&ulparam > 1)

        'EDIT anlegen
        x$ = GetText$(LV&, &uwparam, &ulparam)
        x&= &ulparam
        y&= &uwparam
        x%=0
        y%=SendMessage(LV&,$101D, x&,0)

        Whileloop 0,x&-1,1

            x%=x%+SendMessage(LV&,$101D, &loop,0)

        EndWhile

        ' EDIT-Position vom System abhängig......austesten
        Wert& = Create("Edit",LV&,x$,x%+2,(y&*20)+26,y%-2,18)
        @sendmessage(Wert&,$00C5,9,0)
        SetFont Wert&,LV_F&
        setfocus(wert&)
        @SendString(Wert&,"+({END})")

        While getfocus(wert&)

            waitinput
            case getfocus(Wert&) : NUMWERT Wert&, 2

        EndWhile

        case trim$(gettext$(wert&))="" : settext Wert&,"0"
        SetText LV&, y&, x&, translate$(gettext$(wert&),",",".")
        DestroyWindow(Wert&)
        setfocus(%hwnd)

    ElseIf getfocus(Minus&) AND (Teile%>4)

        SetText LV&, GetCount(LV&)-3, 0, "0.5"
        DeleteString(LV&,GetCount(LV&)-1)
        DeleteString(LV&,GetCount(LV&)-1)
        dec Teile%,2
        settext Teile&,str$(Teile%)
        settext Teil_L&,str$(val(gettext$(Abst&))/Teile%)
        setfocus(%hwnd)

    ElseIf getfocus(Plus&)

        SetText LV&, GetCount(LV&)-1, 0, "1"
        Addstring(LV&,"2|"+str$(GetCount(LV&))+"|0|0|0|0")
        Addstring(LV&,"0.5|"+str$(GetCount(LV&))+"|0|0|0|0")
        inc Teile%,2
        settext Teile&,str$(Teile%)
        settext Teil_L&,str$(val(gettext$(Abst&))/Teile%)
        setfocus(%hwnd)

    Endif

Endwhile

Usermessages 0
SubClass %hwnd, 0
END

SubClassProc

    If SubClassMessage(%hWnd, ~WM_NOTIFY)

        If Long(&sLParam,8)=-3

            item&=Long(&sLParam,12)

            If item&<>-1

                SendMessage(%hwnd, 2000, item&, Long(&sLParam,16))

            EndIf

        EndIf

    EndIf

EndProc

Proc ITEM_LEER

    Parameters x%

    WhileLoop 0,(GetCount(LV&)-1) ,1

        SetText LV&,&loop,x%,"0"

    Wend

EndProc

Proc RECHNE

    Set("Decimals",2)
    Declare S1!,F!,V!,G!,S!,T!
    T!=val(gettext$(Abst&))/Teile%

    WhileLoop 0,(GetCount(LV&)-1) ,1

        y!=sqr(val(Gettext$(LV&,&loop,5)) * 2) * Pi() / 4' Radius
        x!=val(Gettext$(LV&,&loop,3)) * val(Gettext$(LV&,&loop,4))'Vier-Eck
        case val(Gettext$(LV&,&loop,2))=0 : SetText LV&,&loop,2,str$(x!)'keine Fläche dann a*b

        If val(Gettext$(LV&,&loop,2))=0

            SetText LV&,&loop,2,str$(Y!)'keine Fläche dann R

        Else

            x!=sqr(val(Gettext$(LV&,&loop,5)) * 2) - y!
            SetText LV&,&loop,2, str$(val(Gettext$(LV&,&loop,2))- x! )'Fläche - Rundung

        EndIf

        F! = F! + (val(Gettext$(LV&,&loop,2)) * val(Gettext$(LV&,&loop,0)))
        S1!=S1! + (val(Gettext$(LV&,&loop,2)) * val(Gettext$(LV&,&loop,0)) * val(Gettext$(LV&,&loop,1)))

    EndWhile

    If (F!=0) OR (S1!=0)

        MessageBox("Eingaben fehlen,\noder dürfen nicht Null sein.\n\nBitte Ändern!","Hinweis",32)
        RETURN

    EndIf

    V!= F!*2/3*val(gettext$(Abst&))/Teile%
    SetText LV1&,0,1,str$(V!)
    S!=S1!/F!*val(gettext$(Abst&))/Teile%
    SetText LV1&,1,1,str$(S!)
    G!=V!*val(gettext$(Spez&))
    SetText LV1&,2,1,str$(G!)
    SetText LV1&,3,1,str$(S!*G!)

EndProc

Proc NUMWERT

    Parameters ED.N&,ED.N%
    var n.a$="abcdefghijklmnopqrstuvwxyz"
    n.a$=n.a$+Upper$("abcdefghijklmnopqrstuvwxyz")
    n.a$=n.a$+"!§$%&/()=?´´*':;-_²³{[]}\^°<>|++-"
    var n.c$=""

    WhileLoop len(n.a$)

        n.c$ = MID$(n.a$,&Loop,1)' c$= der nte Stringteil
        Settext ED.N&,@Translate$(gettext$(ED.N&),n.c$,"")' unzulässige löschen
        Settext ED.N&,@Translate$(gettext$(ED.N&),"..",".")' doppelte löschen
        Settext ED.N&,@Translate$(gettext$(ED.N&),",,",",")' doppelte löschen

    EndWhile

    Settext ED.N&,@Translate$(gettext$(ED.N&),",",".")
    n.a$=trim$(gettext$(ED.N&))

    WhileLoop ED.N%+1

        @Match$("~.", n.a$)

        If (%MatchPos>0) AND (%MatchPos<ED.N%+1)

            n.a$="0"+n.a$

        EndIf

    EndWhile

    If len(n.a$)=ED.N%

        case @IsKey(8):n.a$=left$(n.a$,len(n.a$))
        casenot @IsKey(8):n.a$=left$(n.a$,ED.N%)+"."

    EndIf

    SetText ED.N&,n.a$
    sendmessage(ED.N&,$00B1,len(gettext$(ED.N&)),len(gettext$(ED.N&))+1)'Cursor ans Ende
    SetFocus(ED.N&)

EndProc

 
Gruß Thomas
Windows XP SP2, XProfan X2
19.10.2016  
 




HofK
Thomas Freier (19.10.2016)
Ansatz mal verfolgt. Die Edit-Position muß aber für das verwendete WIN angepaßt werden (im Moment für WIN7).


Für Win 10 passt es bei mir so wie vorgegeben.
 
22.10.2016  
 




Christof
Neuß
Hallo Thomas,

das ist ja cool. Danke!

Sorry. Momentan komme ich nicht so wirklich dazu, mich damit zu beschäftigen. Aber das mache ich auf jeden Fall noch.

Gruß

Christof
 
XProfan X3
Win10 16 GB RAM
30.10.2016  
 




Matthias
Arlt
Hab das Beispiel von Thomas der besseren Übersicht wegen mal auf das Wesentliche reduziert und etwas modifiziert. So sollte es eigentlich auch unabhängig von der Win-Version passen...
Window 0,0 - 600,410
declare LV&,Spalte&,Zeile&,Item&,Edit&,Font&,Txt$
declare rect#,cellpos_x%,cellpos_y%,cellwidth%,cellhight%
Font&=CreateFont("Verdana",16,0,0,0,0)
SetDialogFont Font&
LV&=Create("GridBox",%hwnd,"x;1;0;Spalte 1;1;60;Spalte 2;1;120;Spalte 3;1;80;Spalte 4;1;80;Spalte 5;1;80",0,10,10,460,250)
Addstring(LV&,"0.5|0|0|0|0|0")
Addstring(LV&,"2|1|0|0|0|0")
Addstring(LV&,"1|2|0|0|0|0")
Addstring(LV&,"2|3|0|0|0|0")
Addstring(LV&,"0.5|4|0|0|0|0")
SetFont LV&,Font&
SubClass %hwnd, 1
usermessages 2000

while 1

    waitinput

    if (%umessage = 2000)

        Txt$ = GetText$(LV&,&uwparam,&ulparam)
        Spalte&= &ulparam
        Zeile&= &uwparam
        dim rect#,16
        SendMessage(LV&,$100E,Zeile&,rect#)'LVM_GETITEMRECT
        cellpos_x% = long(rect#,0)
        cellpos_y% = long(rect#,4) - 1
        cellwidth% = sendmessage(LV&,$101D,Spalte&,0)
        cellhight% = (long(rect#,12) - long(rect#,4)) + 1

        if Spalte& > 0

            whileloop 0,(Spalte& - 1),1

                cellpos_x% = cellpos_x% + sendmessage(LV&,$101D,&loop,0)

            wend

        endif

        dispose rect#
        Edit& = create("Edit",LV&,Txt$,cellpos_x%,cellpos_y%,cellwidth%,cellhight%)
        setfont Edit&,Font&
        setfocus(Edit&)
        'SendMessage(Edit&,"+({END})") 'Cursor ans Ende setzen...
        SendMessage(Edit&,$B1,0,-1)'oder Alles markieren...

        while getfocus(Edit&)

            waitinput

        wend

        settext LV&,Zeile&,Spalte&,gettext$(Edit&)
        destroywindow(Edit&)
        setfocus(%hwnd)

    endif

wend

usermessages 0
SubClass %hwnd, 0
end

SubClassProc

    if SubClassMessage(%hwnd, 78)'WM_NOTIFY

        if (Long(&sLParam,8) = -3)

            Item&=Long(&sLParam,12)

            if (Item& <> -1)

                SendMessage(%hwnd,2000,Item&,Long(&sLParam,16))

            endif

        endif

    endif

endproc

 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
02.11.2016  
 




Thomas
Freier
Klasse, und bitte zu den Quelltexten als Gridbox mit Item-Edit .
 
Gruß Thomas
Windows XP SP2, XProfan X2
02.11.2016  
 




Matthias
Arlt
Wurde soeben erledigt...

Gruß Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
02.11.2016  
 




Christof
Neuß
Hey, das ist ja klasse!!!

Vielen Dank!

Kriege ich es selber hin, dass die Eingabe für den Abschluss auch auf ENTER (und/oder Pfeiltasten) reagiert, statt nur auf Klick in das nächste Feld?

Gruß

Christof
 
XProfan X3
Win10 16 GB RAM
04.11.2016  
 




Thomas
Freier
Ja über die 'AddHotKey's.
Soll dann aber über die Pfeiltasten das nächste Item editiert werden, mußt du die EDIT-Positionswerte (Spalte& bzw. Zeile& ändern) neu ermitteln, also eigenes Proc.
Hier übernimmt nur ENTER, Pfeil links oder rechts den neuen Wert.
Window 0,0 - 600,410
declare LV&,Spalte&,Zeile&,Item&,Edit&,Font&,Txt$
declare rect#,cellpos_x%,cellpos_y%,cellwidth%,cellhight%
Font&=CreateFont("Verdana",16,0,0,0,0)
SetDialogFont Font&
LV&=Create("GridBox",%hwnd,"x;1;0;Spalte 1;1;60;Spalte 2;1;120;Spalte 3;1;80;Spalte 4;1;80;Spalte 5;1;80",0,10,10,460,250)
Addstring(LV&,"0.5|0|0|0|0|0")
Addstring(LV&,"2|1|0|0|0|0")
Addstring(LV&,"1|2|0|0|0|0")
Addstring(LV&,"2|3|0|0|0|0")
Addstring(LV&,"0.5|4|0|0|0|0")
SetFont LV&,Font&
SubClass %hwnd, 1
usermessages 2000
AddHotKey 7001, 13, 0'Return
AddHotKey 7002, 37, 0'Pfeil Links
AddHotKey 7003, 39, 0'Pfeil Rechts

while 1

    waitinput

    if (%umessage = 2000)

        Txt$ = GetText$(LV&,&uwparam,&ulparam)
        Spalte&= &ulparam
        Zeile&= &uwparam
        ' Werte für das EDIT
        dim rect#,16
        SendMessage(LV&,$100E,Zeile&,rect#)'LVM_GETITEMRECT
        cellpos_x% = long(rect#,0)
        cellpos_y% = long(rect#,4) - 1
        cellwidth% = sendmessage(LV&,$101D,Spalte&,0)
        cellhight% = (long(rect#,12) - long(rect#,4)) + 1

        if Spalte& > 0

            whileloop 0,(Spalte& - 1),1

                cellpos_x% = cellpos_x% + sendmessage(LV&,$101D,&loop,0)

            wend

        endif

        dispose rect#
        ' EDIT
        Edit& = create("Edit",LV&,Txt$,cellpos_x%,cellpos_y%,cellwidth%,cellhight%)
        setfont Edit&,Font&
        setfocus(Edit&)
        'SendMessage(Edit&,"+({END})") 'Cursor ans Ende setzen...
        SendMessage(Edit&,$B1,0,-1)'oder Alles markieren...

        while 1

            waitinput

            If MenuItem(7001) OR MenuItem(7002) OR MenuItem(7003)

                settext LV&,Zeile&,Spalte&,gettext$(Edit&)
                destroywindow(Edit&)
                break

            Else

                destroywindow(Edit&)
                break

            Endif

        wend

        SendMessage(LV&,$102A,0,0)'LV neu zeichnen
        setfocus(%hwnd)

    endif

wend

usermessages 0
SubClass %hwnd, 0
end

SubClassProc

    if SubClassMessage(%hwnd, 78)'WM_NOTIFY

        if (Long(&sLParam,8) = -3)

            Item&=Long(&sLParam,12)

            if (Item& <> -1)

                SendMessage(%hwnd,2000,Item&,Long(&sLParam,16))

            endif

        endif

    endif

endproc

 
Gruß Thomas
Windows XP SP2, XProfan X2
04.11.2016  
 




Matthias
Arlt
...oder bspw. so:
Window 0,0 - 600,410
declare LV&,Spalte&,Zeile&,Item&,Edit&,Font&,Txt$
declare rect#,cellpos_x%,cellpos_y%,cellwidth%,cellhight%
Font&=CreateFont("Verdana",16,0,0,0,0)
SetDialogFont Font&
LV&=Create("GridBox",%hwnd,"x;1;0;Spalte 1;1;60;Spalte 2;1;120;Spalte 3;1;80;Spalte 4;1;80;Spalte 5;1;80",0,10,10,460,250)
Addstring(LV&,"0.5|0|0|0|0|0")
Addstring(LV&,"2|1|0|0|0|0")
Addstring(LV&,"1|2|0|0|0|0")
Addstring(LV&,"2|3|0|0|0|0")
Addstring(LV&,"0.5|4|0|0|0|0")
SetFont LV&,Font&
SubClass %hwnd, 1
usermessages 2000
AddHotKey 13, 13, 0
AddHotKey 37, 37, 0
AddHotKey 38, 38, 0
AddHotKey 39, 39, 0
AddHotKey 40, 40, 0

while 1

    waitinput

    if (%umessage = 2000)

        Txt$ = GetText$(LV&,&uwparam,&ulparam)
        Spalte&= &ulparam
        Zeile&= &uwparam
        dim rect#,16
        SendMessage(LV&,$100E,Zeile&,rect#)'LVM_GETITEMRECT
        cellpos_x% = long(rect#,0)
        cellpos_y% = long(rect#,4) - 1
        cellwidth% = sendmessage(LV&,$101D,Spalte&,0)
        cellhight% = (long(rect#,12) - long(rect#,4)) + 1

        if Spalte& > 0

            whileloop 0,(Spalte& - 1),1

                cellpos_x% = cellpos_x% + sendmessage(LV&,$101D,&loop,0)

            wend

        endif

        dispose rect#
        Edit& = create("Edit",LV&,Txt$,cellpos_x%,cellpos_y%,cellwidth%,cellhight%)
        setfont Edit&,Font&
        setfocus(Edit&)
        'SendMessage(Edit&,"+({END})") 'Cursor ans Ende setzen...
        SendMessage(Edit&,$B1,0,-1)'oder Alles markieren...

        while getfocus(Edit&)

            waitinput

            if (%menuitem = 13)

                break

            elseif (%menuitem = 37) | (%menuitem = 38) | (%menuitem = 39) | (%menuitem = 40)

                case (%menuitem = 37) : SendMessage(%hwnd,2000,(Zeile&),(Spalte& - 1))
                case (%menuitem = 38) : SendMessage(%hwnd,2000,(Zeile& - 1),Spalte&)
                case (%menuitem = 39) : SendMessage(%hwnd,2000,(Zeile&),(Spalte& + 1))
                case (%menuitem = 40) : SendMessage(%hwnd,2000,(Zeile& + 1),Spalte&)
                break

            endif

        wend

        settext LV&,Zeile&,Spalte&,gettext$(Edit&)
        destroywindow(Edit&)
        setfocus(%hwnd)

    endif

wend

usermessages 0
SubClass %hwnd, 0
end

SubClassProc

    if SubClassMessage(%hwnd, 78)'WM_NOTIFY

        if (Long(&sLParam,8) = -3)

            Item&=Long(&sLParam,12)

            if (Item& <> -1)

                SendMessage(%hwnd,2000,Item&,Long(&sLParam,16))

            endif

        endif

    endif

endproc

 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
04.11.2016  
 




Alibre
Ja, das ist ja Genial!
Vielen Dank an alle!
 
XProfan X4
PRFellow für ProfanX4 -> Das wär was!
28.01.2021  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

11.308 Betrachtungen

Unbenanntvor 0 min.
Gast.0815 vor 17 Tagen
Walter03.05.2024
Rainer Hoefs10.05.2023
Hans Neff24.01.2023
Mehr...

Themeninformationen



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