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
      Verwalter

      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
      Verwalter

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

      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
      Verwalter

      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.