Prüfen ob an einer Position ein Objekt ist

Startseite Foren Deutsches LiveCode-Forum Prüfen ob an einer Position ein Objekt ist

Ansicht von 11 Antwort-Themen
  • Autor
    Beiträge
    • #21783
      Oliver122
      Teilnehmer

        Hallo zusammen,

        wie kann man prüfen ob an einer Position bereits ein Objekt, in meinem Fall eine grp ist?

        Folgender Fall:
        Wenn ich auf einen Knopf drücke, wird eine grp aus zwei btn erstellt.
        diese ist an einer festgelegten Positon. Das funktioniert auch.
        Wird der btn erneut gedrückt, soll eine identische grp darunter erstellt werden-
        Das funktioniert auch indem der top Wert immer um eine bestimmte Summer erhöht wird.

        Das Problem:

        Es würde immer bis ins unendliche nach unten gehen. Hat man beispielsweise fünf grp’s untereinander erstellt
        und löscht die dritte, soll eine neue grp, bei bedarf an der freigewordenen Position erstellt werden
        und nicht darunter. Da der Wert in der Variablen aber immer erhöht wird, funktioniert das nicht.

        Es müsste, wenn man auf den Erstellen Knopf drückt eine Prüfung ablaufen. Diese muss oben anfangen und
        erst an einer freien Position eine grp erstellen. Dabei dürfen die Gruppen aber nicht aufeinander gelegt werden.

        Ich hoffe es ist einigermaßen verständlich erklärt.

        Könnt ihr mir hier weiterhelfen?

      • #21787
        Torsten
        Teilnehmer

          Hi Oliver,

          der Befehl, den Du suchst, heisst intersect https://livecode.fandom.com/de/wiki/Intersect

          Du könntest Dir auch die Positionen der Gruppe als Keys in einem Array merken und den Value auf false setzen, wenn die Gruppe gelöscht wird.

          Happy Coding
          Torsten

        • #21788
          Oliver122
          Teilnehmer

            Hallo Torsten,

            danke für die Info. Ich teste es morgen oder die Tage mal.

          • #21790
            Klaus Major
            Administrator

              Hi Oliver,

              1. mit INTERSECT wirst Du hier nicht weiterkommen, denn Deine Gruppen sollen sich ja eben nicht überlappen.
              2. tu uns und Dir selber einen Gefallen und vergiss das mit dem Plural und dem Apostroph, der wird in keiner Sprache so gebildet. grp -> grps genau wie car -> cars, btn -> btns etc.
              3. das mit dem Array ist eine gute Idee!
              Spontane Idee:
              Füll es mit Name, RECT und aktiv/gelöscht, wenn eine Gruppe erzeugt/gelöscht wird.
              Eventuell den Namen der Gruppe als KEY nehmen.

              So kannst Du mit einem flotten REPEAT LOOP herausfinden, wo gerade Platz für eine neue Gruppe ist.
              Wenn alle Einträge im Array zu STATUS = aktiv, musst Du “unten” die neue Gruppe anfügen.
              Ansonsten, dort wo der Loop zum ersten Mal auf -> gelöscht trifft.

              Bei Fragen dazu stehe ich gerne parat! 🙂

              Gruß

              Klaus

            • #22104
              Oliver122
              Teilnehmer

                Hallo zusammen,

                ich komme nicht weiter.

                Dieser Teil funktioniert und erzeugt eine Variable die

                on erstellen3
                   put 0 into x
                   repeat with y = 10085 down to 140 step - 45
                      put y & "_" & "0" &  return after Pos
                      put y & "_" & "0" &  return after fld "feld1" 
                      set the itemDelimiter to "_"
                      sort the first number of fld "feld1" numeric
                      sort the first number of Pos numeric
                      
                   end repeat
                end erstellen3

                etwa so aussieht….

                140_0
                185_0
                230_0
                275_0
                320_0
                365_0
                410_0
                455_0
                500_0
                545_0
                590_0
                635_0
                680_0
                725_0
                770_0
                815_0
                860_0
                905_0
                950_0
                995_0
                1040_0
                1085_0
                ………

                Danach soll mit einem Click auf einen Button die Position der danach zu erstellenden grp festgelegt werden.
                Das klappt nie

                Ich habe es so versucht..

                
                repeat for each line y in Pos
                   set the itemDelimiter to "_"
                   if the second item of y  = 0 then
                      put the first item of y into oben 
                      add 1 to the last  item of y
                      
                   end if
                end repeat

                und so

                repeat with y = 1 to 222
                   set the itemDelimiter to "."
                   if the last item of line y of Pos = 0 then
                      put the first item of line y of Pos into oben 
                      add 1 to the last item of line y in Pos
                   end if
                end repeat

                Die 0 wird nie zur eins und meistens wird in die Variable “oben” 140 gepackt und dann nicht
                mehr verändert.

                Könnt ihr mir helfen?

              • #22109
                Klaus Major
                Administrator

                  Hallo Oliver,

                  oha, da ist ja Einiges im Argen!

                  1. Nicht alles auf einmal machen, das geht auf Kosten der Effektivität (= Geschwindigkeit)!
                  Zuerst Deine Liste erstellen in einer Variablen.
                  Zugriffszeit auf Variablen ist 1000 * schneller als auf Felder
                  Dann die Liste sortieren, aber mit der korrekten Syntax!
                  Mich wundert, daß LC das ohne Mecker geschluckt hat!?

                  on erstellen3
                     
                     ## Wozu x?
                     put 0 into x
                     
                     repeat with y = 10085 down to 140 step - 45
                        put y & "_" & "0" &  return after Pos
                     end repeat
                     
                     ## Letztes RETURN  entfernen oder Du endest mit einer leeren Zeile!
                     delete char -1 of Pos
                     
                     ## JETZT erst sortieren und zwar richtig und nicht schon in jedem Loop!
                     set itemdel to "_"
                     sort lines of Pos numeric by item 1 of each
                     
                     ## Und jetzt ins Feld packen als letzten Schritt:   
                     put Pos into fld "feld1"
                  end erstellen3

                  2. Der “Container” (hier Pos), den wir mit REPEAT FOR EACH abarbeiten ist READ-ONLY!
                  Das bedeutet, nach Deinen Loop ist Pos UNVERÄNDERT!, egal was Du mit Y machst!
                  Deshalb müssen wir hier eine neue Variable erstellen mit den gewünschten Änderungen

                  ...
                     ## EINMAL setzten reicht!
                     set the itemDelimiter to "_"
                     
                     repeat for each line y in Pos
                        if item 2 of y = 0 then
                  
                           ## First, second etc. ist tolles Englisch, aber mit Nummern sind wir schneller!
                           put item 1 of y & "_1" & CR after Pos2
                  
                           ## In Deinem Loop hast Du "...item 1 into oben..." gesetzt?
                           ## Also immer wieder überschrieben, keine Ahnung, was Du damit bezweckst?
                           put item 1 of y into oben
                        end if
                     end repeat
                     
                     ## Letztes RETURN  entfernen!
                     delete char -1 of Pos2
                  
                     ## Oder was Du nun damit vorhast:
                     ## put Pos2 into Pos
                  ...

                  Gruß

                  Klaus

                • #22254
                  Oliver122
                  Teilnehmer

                    Hallo zusammen,

                    Endlich klappte es.
                    Hier mal das gesamte Skript. So wird auch verständlich wozu es dient
                    Eigentlich gar nicht so schwer.

                    global x, y, oben, oben2,  z,  tSkript, Pos
                    
                    on erstellen
                       if Pos = empty then
                          put 0 into oben
                          put 0 into x
                          repeat with y = 10085 down to 140 step - 45
                             put y & return after Pos
                          end repeat
                          sort lines of Pos numeric
                          erstellen2
                       else
                          erstellen2
                       end if
                    end erstellen
                    
                    on erstellen2
                       add 1 to x 
                       repeat with y = 1 to 1
                          put line y of Pos into oben
                          delete line y of Pos
                       end repeat
                       herstellen
                    end erstellen2
                    
                    on herstellen
                       lock screen
                       create grp ("gruppe."&x) in grp "scrollArea"
                       create  btn "Art" in grp ("gruppe."&x)  of grp "scrollArea"
                       create btn "Löschen" in grp ("gruppe."&x) of grp "scrollArea"
                       put "global z, Pos" & CR &  "on mouseUp" & CR & "put the top of the owner of me & return after Pos" & CR & "sort Pos numeric" & CR & "put the short name of the owner of me into z" & CR & "loeschen" & CR & "end mouseUp" into tSkript 
                       set the script of btn "Löschen" of grp  ("gruppe."&x)  to tSkript 
                       set the width of btn "Art" of grp ("gruppe."&x) to 100
                       set the height of btn "Art" of grp ("gruppe."&x) to 40
                       set the left of btn "Art" of grp ("gruppe."&x) to 15
                       set the width of btn "Löschen" of grp ("gruppe."&x) to 100
                       set the height of btn "Löschen" of grp ("gruppe."&x) to 40
                       set the left of btn "Löschen" of grp ("gruppe."&x) to 121
                       set the left of grp ("gruppe."&x) to 15
                       set the top of grp ("gruppe."&x) to oben
                       set the style of btn "Löschen" of grp ("gruppe."&x) to roundRect
                       set the backgroundcolor of btn "Löschen" of grp ("gruppe."&x) to red
                       set the style of btn "Art" of grp ("gruppe."&x) to roundRect
                       set the backgroundcolor of btn "Art" of grp ("gruppe."&x) to green
                       
                       unlock screen
                    end herstellen
                    
                    on loeschen
                       show grp "weg"
                    end loeschen
                    

                    Der Knopf Art soll ein Fenster öffnen, wo man dann einen Kredit und die Abzahlung eintragen kann.
                    Das kommt jetzt noch.

                    Der “oben” Wert der bei jedem erstellen einer neuen Gruppe gelöscht wird, wird durch das Löschen der Groppe
                    wieder in die Variable geschrieben

                  • #22256
                    Klaus Major
                    Administrator
                      ...
                       repeat with y = 1 to 1
                            put line y of Pos into oben
                            delete line y of Pos
                         end repeat
                      ...

                      Ernsthaft? 😀

                    • #22258
                      Oliver122
                      Teilnehmer

                        Ja es soll ja immer die oberste line gelöscht werden. So klappt es.
                        Ist es denn nicht ok?

                      • #22268
                        Klaus Major
                        Administrator

                          Sicher ist das OK, aber extremer OVERKILL! 🙂

                          Wie wäre es stattdessen mit einem popeligen:

                          ...
                          put line 1 of Pos into oben
                          delete line 1 of Pos
                          ...

                          Macht das Selbe mit weniger Tipparbeit. 😎

                        • #22286
                          Oliver122
                          Teilnehmer

                            Stimmt das würde wohl auch gehen. Was habe ich hier nicht alles ausprobiert und eigentlich ist es so einfach

                          • #22288
                            Klaus Major
                            Administrator

                              Nicht immer so kompliziert denken! 🙂

                              Wie im richtigen Leben, da hätten wir die erste Zeile genommen und danach durchgestrichen oder ausradiert, OHNE uns über einen LOOP Gedanken zu machen.

                          Ansicht von 11 Antwort-Themen
                          • Du musst angemeldet sein, um auf dieses Thema antworten zu können.