Announcement

Collapse
No announcement yet.

OnColumnDragged

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • OnColumnDragged

    Hallo,

    kann ich im Ereignis OnColumnDragged bei einem listview,
    das verschieben von spalten per drag and drop abbrechen?
    wenn ja wie?

    Gruß

    Markus
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Moin Markus,

    ich habe das so gelöst:
    // Initialisierung
    procedure TForm1.FormCreate(Sender: TObject);
    var
    i : integer;
    begin
    for i := 0 to ListView1.Columns.Count-1 do ListView1.Column[i].Tag := i
    end;
    // Ereignis
    procedure TForm1.ListView1ColumnDragged(Sender: TObject);
    const
    C_DoDrag : boolean = True; // Nur für Demo: Jeder 2. Drag-Versuch wird zurückgenommen
    var
    i : integer;
    s : string;
    begin
    if (C_DoDrag) then
    for i := 0 to ListView1.Columns.Count-1 do ListView1.Column[i].Tag := i
    else
    for i := 0 to ListView1.Columns.Count-1 do ListView1.Column[i].Index := ListView1.Column[i].Tag;

    C_DoDrag := not C_DoDrag;
    end;

    Gruß,
    Geer

    Comment


    • #3
      Hallo Geert!

      könntest du diesen code etwas erklären, bitte?
      ich verstehe nicht ganz, wie das zurücknehmen funktioniert!

      Gruß und danke!

      Marku
      Herzliche Grüße

      Markus Lemcke
      barrierefreies Webdesign

      Comment


      • #4
        Moin Markus,
        - Im OnCreate initialisiere ich den Mechanismus, indem jede Coumn den aktuellen (Anfangs-)Index als Tag-Eigenschaft erhält
        - Als Flag, ob ein "DragColumn" durchgeführt werdem soll, verwende ich ZUR DEMONSTRATION C_DoDrag - hier musst Du Deine Bedingung definieren/einfügen
        - Falls ein "DragColumn" gewollt durchgeführt wurde (C_DoDrag = True), wird die dann geänderte Spaltenreihenfolge den Tag-Eigenschaften der Spalten neu zugewiesen
        -> for i := 0 to ListView1.Columns.Count-1 do ListView1.Column[i].Tag := i
        - Falls ein "DragColumn" UNgewollt durchgeführt wurde (C_DoDrag = Falsed), wird die geänderte Spaltenreihenfolge gegen die vorherige, noch in der Tag-Eigenschaft gespeicherte, Reihenfolge ausgetauscht - geht über die Index-Eigenschaft
        -> for i := 0 to ListView1.Columns.Count-1 do ListView1.Column[i].Index := ListView1.Column[i].Tag;
        Gruß,
        Geer

        Comment


        • #5
          Hallo Geert,

          habe es so probiert:
          <pre>
          for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
          begin
          //Wenn im Warenkorb was drin ist
          if LvwWarenkorbFumo.Items.Count > 0 then
          begin
          LvwWarenkorbFumo.Column[i].Index := LvwWarenkorbFumo.Column[i].Tag;
          FehlerMeldungAnzeigen('Im Warenkorb sind Artikel, deswegen können die Spalten nicht verschoben werden');
          exit;
          end
          else LvwWarenkorbFumo.Column[i].Tag := i;
          end;
          </pre>

          also wenn im listview (=LvwWarenkorbFumo) einträge sind,
          soll nicht verschoben werden.
          das initialisieren, mache ich im onpaint.

          beim testen viel mir auf, dass wenn ich spalten tausche die direkt nebeneinenander liegen, macht er es, auch wenn er es nicht darf!
          wenn ich spalten verschiebe die nicht nebeneinander liegen funtioniert es korrekt!
          funtioniert es bei dir immer?

          gruß und danke!

          Marku
          Herzliche Grüße

          Markus Lemcke
          barrierefreies Webdesign

          Comment


          • #6
            Moin Markus,
            kleine Önderung im Ablauf...
            //Wenn im Warenkorb was drin ist
            if LvwWarenkorbFumo.Items.Count > 0 then begin
            for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
            LvwWarenkorbFumo.Column[i].Index := LvwWarenkorbFumo.Column[i].Tag;
            ShowMessage('Im Warenkorb sind Artikel, deswegen können die Spalten nicht verschoben werden');
            end
            else
            for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
            LvwWarenkorbFumo.Column[i].Tag := i;
            ... und es sollte gehen.
            Gruß,
            Geer

            Comment


            • #7
              <b>moin</b> Geert!

              habe es so probiert:
              <pre>
              //Wenn im Warenkorb was drin ist
              if LvwWarenkorbFumo.Items.Count > 0 then
              begin
              for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
              begin
              LvwWarenkorbFumo.Column[i].Index := LvwWarenkorbFumo.Column[i].Tag;
              Meldung('Im Warenkorb sind Artikel, deswegen können die Spalten nicht verschoben werden');
              exit;
              end;
              end
              else
              for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
              LvwWarenkorbFumo.Column[i].Tag := i;
              </pre>

              passiert aber immer noch, dass er manchmal verschiebt, obwohl er nicht sollte!

              Gruß

              Marku
              Herzliche Grüße

              Markus Lemcke
              barrierefreies Webdesign

              Comment


              • #8
                Moin Markus
                ***grummel*** der entscheidende Unterschied zwischen meinem Vorschlag und Deiner Realisierung ist das "EXIT" bei Dir an ungünstiger Stelle.
                Das "Exit" müsste, wenn überhaupt benötigt, HINTER und nicht IN der for-loop stehen, da diese ja so nur einmal - und nicht bis count-1 - durchlaufen wird.
                Gruß,
                Geer

                Comment


                • #9
                  okay, ich probiere es heute mittag mal.
                  bin gerade an anderen dingen!

                  Danke
                  Herzliche Grüße

                  Markus Lemcke
                  barrierefreies Webdesign

                  Comment


                  • #10
                    habe es so probiert:

                    <pre>
                    //Wenn im Warenkorb was drin ist
                    if LvwWarenkorbFumo.Items.Count > 0 then
                    begin
                    for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
                    begin
                    LvwWarenkorbFumo.Column[i].Index := LvwWarenkorbFumo.Column[i].Tag;
                    end;
                    Meldung('Im Warenkorb sind Artikel, deswegen können die Spalten nicht verschoben werden');
                    exit;
                    end
                    else
                    for i := 0 to LvwWarenkorbFumo.Columns.Count-1 do
                    LvwWarenkorbFumo.Column[i].Tag := i;

                    </pre>

                    mal geht es mal geht es nicht, sprich es wird trotzdem verschoben! ich bin völlig ratlos!

                    gruß

                    Marku
                    Herzliche Grüße

                    Markus Lemcke
                    barrierefreies Webdesign

                    Comment


                    • #11
                      Moin Markus,
                      ich habe Dein Beispiel in einer Testunit nachgebildet, wobei ich alle Komponenten zur Laufzeit erzeuge und somit keine ungeklärten Eigenschaften auftreten können.
                      Damit tritt das von Dir beschriebene fehlerhafte Verhalten nicht auf.
                      Die Unit lege ich als Anhang bei (erzeuge zum Probieren ein neues Projekt, kopiere den Quelltext in das pas-file und weise "OnCreate" zu).

                      Einen habe ich noch...Du schreibst, dass Du die Initialisierung im OnPaint durchführst - ist natürlich kritisch, da Du nicht weisst, wann das Ereignis auftritt. "OnCreate" ist besser, da diese Initialisierung auch nur einmal aufgerufen werden sollte.
                      Gruß,
                      Geer

                      Comment


                      • #12
                        okay, schaue nochmal danach!
                        danke!

                        Gruß

                        Marku
                        Herzliche Grüße

                        Markus Lemcke
                        barrierefreies Webdesign

                        Comment


                        • #13
                          hallo geert,

                          kannst du mir noch bitte, das formular anhängen zum unit
                          Herzliche Grüße

                          Markus Lemcke
                          barrierefreies Webdesign

                          Comment


                          • #14
                            Klar ... ist aber leer !
                            Ich schicke gleich das ganze Projekt.
                            Gruß,
                            Geer

                            Comment


                            • #15
                              danke! schaue es mir jetzt an
                              Herzliche Grüße

                              Markus Lemcke
                              barrierefreies Webdesign

                              Comment

                              Working...
                              X