Announcement

Collapse
No announcement yet.

Problem mit TStringList;

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

  • Problem mit TStringList;

    ich verwende ein TStringList; um parameter einem Report (builder) zu übergeben...

    Leider kann ich diese TStringList nur einmal verwenden den wenn ich den Report nocheinmal starte sagt er mir mein report (von mir gesetzte Meldung!)
    <b>keine Daten vorhanden </b>

    was passiert mit der TStringList ???

    Kann mir jemand ein Beispiel machen wie ich eine Stringlist (globale TStringList verwenden kann und vor einer neuzuweisung wieder löschen (free) machen kann?

    <b>Hinzufügen der einzelenen items einer listbox</b>

    stringlist1.Assign(listbox.Items);

    muß ich eine Stringliste wieder freigeben?
    ich brauche sie ständig also sie muß wärend meine anwendung läuft IMMER verfügbar sein, erst wenn ich wieder eine neue "Z u w e i s u n g" mache, möchte ich die stringlist wieder freigeben um "N e u e" strings hinzuzufügen

    Wer kann mir ein bißerl dabei helfen?

    LG aus Wien BINE

  • #2
    in der Hilfe steht das ich das im hauptmenue deklarieren soll

    <pre>
    Im folgenden Beispiel wird der Liste ClickList ein String hinzugefügt. Immer wenn der Benutzer eine Maustaste drückt, fügt die entsprechende Ereignisbehandlungsroutine des Hauptformulars der Liste einen String hinzu. Die Anwendung speichert die Liste in einer Datei, bevor sie freigegeben wird.
    unit Unit1;
    interface
    uses WinTYpes, WinProcs, Classes, Graphics, Forms, Controls, Apps;
    type
    TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    private
    { private-Deklarationen }
    public
    { public-Deklarationen }
    ClickList: TStrings; { Feld deklarieren }
    end;
    var
    Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ClickList := TStringList.Create; { Liste erstellen }
    end;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    ClickList.SaveToFile(ChangeFileExt(Application.Exe Name, '.LOG')); { Liste speichern }
    ClickList.Free; { Listenobjekt freigeben }
    end;
    </pre>

    ich finde das das eine <b>SCHLECHTE</b> Lösung ist

    Ich kann doch nicht im gesamten Projekt mein hauptformular einbinden...

    hat jemand eine andere Lösung für mich??

    BIN

    Comment


    • #3
      stimmt die lösung ist <b>*beep*</b> bekomme jetzt nur noch die meldung "überlauf"

      hab das rückgängig gemacht .. warte mal auf vorschläge..

      BINE :

      Comment


      • #4
        Hallo,<br>
        man muß nicht überall das Hauptformular einbinden, es kann auch eine anderer unit sein - sozusagen eine Sammelunit, denn man muß irgendeine Unit überall einbinden, wo die Stringlist gebraucht wird; allerdings wird dann nicht alles von der Hauptformularunit verfügbar. Die Stringlist kann man dann einfach unter VAR deklarieren, da sie ja nicht explizit zum Formular gehört. Außerdem ist ihr Quelltext etwas seltsam, denn sie deklarieren: <code>"ClickList: TStrings;"</code> und erzeugen eine TStringList. Warum also nicht die folgende definition(?): <code>ClickList: TStringList</code> Wenn sie nun ihre Liste löschen wollen, dann müssen sie die Methode Clear aufrufen und nicht Free, denn Clear löscht die Listenelemente.
        <br><br>
        Gruß Alex

        Comment


        • #5
          Anmerkung: Bei der Übergabe der Stringliste an eine Routine würde ich nur einen Zeiger auf die Liste übergeben, um Resourcen zu sparen

          Comment


          • #6
            der code von mir ist aus der Hilfe (langlebige Stringlisten)

            der (hilfe)code ist für mich total unbrauchbar ... LEIDER

            ich hab vorher versucht das in einer globalen unit zu verwenden,...
            das ging leider auch schief ...

            naja ..

            Comment


            • #7
              muß ich überhaupt free verwenden

              Comment


              • #8
                Hallo,<br>
                Globale Unit:<br>
                -Var ClickList: TStringList;<br>
                -initialization ClickList := TStringList.Create; <br>
                -finalization ClickList.Free;<br>
                - Ach, unter implementation eine Methode, die SaveToFile aufruft und danach z.B. alle Elemente der Liste löscht (ClickLis.Clear), je nach Verwendungszweck <br><br>
                Diese Globale Unit wird dann von allen Units eingebunden (unter implementation), die etwas in die Liste schreiben sollen. Die Liste wird beim Programmstart automatisch erzeugt und beim Programmende vernichtet. Zusätzlich brauch man halt eine Methode, die von anderen Units aufgerufen werden kann, um alle einträge zu speichern und die Elemente danach freizugeben. Oder man macht es beides an der entsprechenden Aufrufstelle. Free ist notwendig, um den allozierten Speicher freizugeben und den darauf verweisenden Zeiger zu löschen (:=nil).<br><br>Gruß Alex

                Comment


                • #9
                  hi ich hab von einem Programmierfreund (hallo falk *grins*)

                  folgendes bekommen, aber leider hab ich damit auch probleme ...

                  <pre>
                  unit uauswertung_globalvar;
                  interface
                  uses classes;
                  var sql_entsorgerwahl: TStringList;
                  implementation
                  var OldExit: Pointer;
                  procedure OnExit; stdcall; far;
                  begin
                  ExitProc := OldExit;
                  sql_entsorgerwahl.Free;
                  end;
                  begin
                  OldExit := ExitProc;
                  ExitProc := @OnExit;
                  sql_entsorgerwahl := TStringList.Create;
                  end

                  Comment


                  • #10
                    wenn ich diese stringlist mit folgenen code meinem report übergebe...
                    also einem sql-string übergebe...

                    <pre>
                    if (sql_entsorgerwahl.Count)<>0 then
                    begin
                    for i := 0 to sql_entsorgerwahl.count - 1 do
                    begin
                    strWerteListe := strWerteListe + '''' + sql_entsorgerwahl[i] + '''';
                    if i < sql_entsorgerwahl.count - 1 then
                    strWerteListe := strWerteListe + ',';

                    end;
                    sql:= sql+ ' And entsorger.e_bez in ('+strWerteListe+')';

                    end
                    </pre>

                    geht das nur BEIM ERSTEN MAL und dann hat sql_entsorgerwahl keinen wert mehr ...

                    BINE :

                    Comment


                    • #11
                      kannst du mir sagen was daran falsch ist,.. ich kenn mich da nicht so aus ....

                      BINE ;

                      Comment


                      • #12
                        ich denke mir das sql_entsorgerwahl freigeben wird sobald es verwendet wurde ... stimmt das??

                        Comment


                        • #13
                          Hallo,
                          <br>wenn sql_entsorgerwahl keinen Wert mehr hat, dann muß es irgendwo freigegeben werden. Dein Übergabecode ist ja o.k., ich denke du rufst danach bestimmt den Exitcode auf und gibst damit die Stringliste frei. Die Exitprocedur darf nur am Programmende bei dir aufgerufen werden. Nach der Erstellung und Übergabe darfst du nur sql_entsorgerwahl.clear aufrufen (nicht den Destruktor).<br><br>Gruß Alex

                          Comment


                          • #14
                            kannst du mir anhand eines Beispiel zeigen wie ich das machen kann?
                            wie gesagt der code ist nicht von mir und ich kenn mich nicht so besonders aus ... mit stringlist usw...

                            LG BINE ;

                            Comment


                            • #15
                              Hallo Bine,

                              ich würde einfach folgendes machen:
                              <b>Bevor</b> Du sql_entsorgerwahl mit Werten füllst rufst Du sql_entsorgerwahl.Clear auf (bitte nicht free). Alle anderen evtl. schon eingefügten sql_entsorgerwahl.Free nimmst Du wieder raus - außer wie von mir in der Unit uauswertung_globalvar vorgeschlagen (Dort ist es notwendig, damit die Liste beim Programmende freigegeben wird)

                              Gruß Fal
                              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                              Comment

                              Working...
                              X