AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Elemente aus TStringList in Laufzeit entfernen

Ein Thema von KetchUp · begonnen am 16. Nov 2018 · letzter Beitrag vom 25. Nov 2018
Antwort Antwort
Seite 5 von 11   « Erste     345 67     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#41

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:41
Oder der Willen, es endlich mit den Klassen zu machen. Dann braucht er die SttringListe, seinen Gegner, nur noch einmalig beim Programmstart.
Ich habe vor 10 Jahren auch mal einen Vokabeltrainer gemacht und der baute auch auf StringListen auf, weil ich damals nix anderes kannte. Sei doch froh, dass dir hier direkt ein sehr viel besserer Weg vorgeschlagen wird. Der ist nicht nur für dich besser, sondern auch für deine Zensur.
Nun ja ich will nicht meckern aber 'Then' immer in die nächste zeile? Verstehe wer will. Das sind alles so kleine Feinheiten.. der Code ist sehr schlecht lesbar.
Aber gut sei's drum.

gruss
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#42

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:47
Jetzt mal Butter bei die Fische.

Wir wollen dir alle nur helfen. Wir wissen sicher auch, dass das, was wir hier von uns geben und dir empfehlen, nicht leicht für dich ist.
Aber nur weil man etwas nicht gleich versteht sollte man doch nicht bei einer Lösung die nachgewiesenermaßen schlecht ist.

Wenn euch nahegelegt wurde das mit einer StringListe zu machen, dann ist das nur eine Empfehlung. Aber du kannst es sehr viel besser machen.
Ich habe dir ein komplettes Beispiel gepostet und Holger hat es komplettiert. Teste es doch einfach aus. Du wirst sehen wie unglaublich leichter alles wird wenn du nur auf uns hörst.

Vergiss die StringListe. Die scheinst du nicht wirklich verstanden zu haben. Das, mit dem Vergessen, haben dir hier auch schon mehrere gesagt.

PS: ich würde mir an dieser Stelle einen schönen und ausführlichen Roman von Michael wünschen =)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#43

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:53
@DieDolly
Den Fehler mit der falschen Freigabe kann man bei Klassen genauso machen, es geht erstmal um ein Grundsätzliches Verständnis dafür, wann man etwas erstellt und wann man es wieder freigibt.

Würden wir das mit Klassen machen und die Klasse dann, wenn wir in der letzten Methode, in der wir sie benötigen, freigeben, während wir sie noch benötigen, hätten wir exakt das gleiche Problem.

Abgesehen davon kennen wir nicht die Vorgaben, die für das Schulprojekt gestellt wurden. Wenn es da z. b. hieße: "Erstelle einen Vokalbeltrainer mit Hilfe einer Stringliste", dann helfen wiederholte Hinweise darauf, dass man das alles irgendwie auch ganz anders machen kann, nicht.

Ich halte es für wichtiger, erstmal mit dem in Delphi von Haus aus vorhandenen klarzukommen. Solange das nicht funktioniert, werden auch die besten selbsterstellten Klassenbibliotheken nicht fertig, weil noch Grundlagenwissen fehlt.

Wenn das da ist, kann man anfangen zu überlegen, ob das Problem nicht deutlich eleganter gelöst werden könnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#44

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:57
Jetzt mal Butter bei die Fische.

Wir wollen dir alle nur helfen. Wir wissen sicher auch, dass das, was wir hier von uns geben und dir empfehlen, nicht leicht für dich ist.
Aber nur weil man etwas nicht gleich versteht sollte man doch nicht bei einer Lösung die nachgewiesenermaßen schlecht ist.

Wenn euch nahegelegt wurde das mit einer StringListe zu machen, dann ist das nur eine Empfehlung. Aber du kannst es sehr viel besser machen.
Ich habe dir ein komplettes Beispiel gepostet und Holger hat es komplettiert. Teste es doch einfach aus. Du wirst sehen wie unglaublich leichter alles wird wenn du nur auf uns hörst.

Vergiss die StringListe. Die scheinst du nicht wirklich verstanden zu haben. Das, mit dem Vergessen, haben dir hier auch schon mehrere gesagt.

PS: ich würde mir an dieser Stelle einen schönen und ausführlichen Roman von Michael wünschen =)
@DieDolly
Sei bitte etwas Verständlichsvoller wenn er nicht einmal weis was free bedeutet
Zitat:
Was hat denn das .Free am Ende für eine Bedeutung/Funktion?
dann scheint er sich noch in der Lernphase zu befinden, irgendwo haben wir alle einmal angefangen.
Nicht das er hier noch die Lust verliert weiterhin zu fragen.

Zitat:
weil noch Grundlagenwissen fehlt.


gruss

Geändert von EWeiss (18. Nov 2018 um 12:59 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#45

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 13:03
Was das Free bedeutet steht mindestens 1x auf den letzten paar Seiten. Ansonsten hilft doch immer F1.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#46

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 13:03
Hallöle...
Zitat:
Hallo, ich will als Schulprojekt einen Vokabeltrainer erstellen
...soweit so gut. Aber dein Lehrer kommt mit Sicherheit aus der guten alten TurboPascal Zeit.

Ich tippe darauf, weil z.B. die Bezeichner nicht dem aktuellem Standard entsprechen. Letztendlich ist es jedem seine Entscheidung wie man es macht...mein Tipp wäre aber, dich von Anfang an an dem offiziellen Styleguide zu orientieren.
http://edn.embarcadero.com/article/10280
oder in deutsch
https://www.delphi-treff.de/object-pascal/styleguide/

[meine Meinung]
Was mich stört:
* Groß/Kleinschreibung der Bezeichner
* leilweise nicht sprechende Namen jpg besser ImageAnswer ...auch Form1 kann anders heißen
* Unterstriche in den Namen in Verbindung des Types des Controls L_CorrectAnswer -> besser lblCorrectAnswer
* kein korrektes try/finally
* Vergleiche auf TRUE ... kann in die Hose gehen https://www.detlef-heibing.de/progra...onstanten.html
* globale Variablen
[/meine Meinung]

Wenn man schon am Lernen ist, dann aber richtig...

Geändert von haentschman (18. Nov 2018 um 13:15 Uhr)
  Mit Zitat antworten Zitat
KetchUp

Registriert seit: 16. Nov 2018
31 Beiträge
 
#47

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 13:06
Eventuell fehlt ihm etwas Mayo <> Ketchup
Der Gedanke hinter dem Nickname war eigentlich "catch up"

OK, dann poste mal den ganzen Quellcode. Der enthält jetzt aber auch ein Haufen Grafikzeug, da ich versuche das visuell ansprechend zu gestalten ohne wirklich Ahnung von Delphi zu haben.

Also das ganz ist in 3 Forms aufgeteilt. Ein Hauptmenü, einmal der Vokabeltrainer und eine Zusammenfassung am Schluss.

Im Hauptmenü kann man auswählen ob man Deutsch>Englisch oder Englisch>Deutsch lernen will und wie oft eine Vokabel wiederholt werden soll. Dann startet man mit einem Button den Vokabeltrainer (zweites Fenster öffnet sich, Erstes wird geschlossen).

Hier werden die Vokabeln abgefragt. Wenn man alle entsprechend der Wiederholungsanzahl richtig eingegeben hat öffnet sich das dritte Fenster (zweites schließt sich).

Hier wird eine Zusammenfassung angezeigt. Wie lange man gebraucht hat, wie viele versuche man gebraucht hat...
Dann soll man mit einem Button das Hauptmenü wieder öffen können um von vorn anzufangen.

Hier der Quellcode für das Hauptmenü
Delphi-Quellcode:
unit U_MainMenu;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;

type
  TForm1 = class(TForm)
    Bt_Start: TButton;
    Bt_SwitchLanguage: TButton;
    Img_Background_01: TImage;
    Img_Background_02: TImage;
    L_HeadingMainMenu: TLabel;
    E_Repititions: TEdit;
    Img_BackgroundSwitchLanguage: TImage;
    L_SwitchLanguage: TLabel;
    E_Amount: TEdit;
    Img_HeadingAmountBackground: TImage;
    L_HeadingAmount: TLabel;
    Img_HeadingRepititionsBackground: TImage;
    L_HeadingRepititions: TLabel;
    procedure Bt_StartClick(Sender: TObject);
    procedure Bt_SwitchLanguageClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    //procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var GermanEnglish: Boolean;
  var Repititions: Byte;

implementation
uses
  U_VocabularyTraining;

{$R *.dfm}

procedure TForm1.Bt_StartClick(Sender: TObject);
var
  Form2: TForm2;

begin
  Repititions:= StrToInt(E_Repititions.Text);
  Form2 := TForm2.Create(Self);
  //Application.ShowMainForm := False;
  //Form1.Visible := False;
  try
    Form2.ShowModal;
  finally
    Form2.Free;
  end;
end;


procedure TForm1.Bt_SwitchLanguageClick(Sender: TObject);

Begin

  If GermanEnglish = True
  Then
    Begin
      L_SwitchLanguage.Caption:='Englisch -> Deutsch';
      GermanEnglish:= False;
    End

  Else
    Begin
      L_SwitchLanguage.Caption:='Deutsch -> Englisch';
      GermanEnglish:= True;

    End;

End;


procedure TForm1.FormCreate(Sender: TObject);
var
  rectangle1: TRect;
  color: Tcolor;
  CenterTextHeadingMainMenu_1, CenterTextHeadingMainMenu_2,
  CenterTextSwitchLanguage_1, CenterTextSwitchLanguage_2,
  CenterTextHeadingAmount_1, CenterTextHeadingAmount_2,
  CenterTextHeadingRepititions_1, CenterTextHeadingRepititions_2: Integer;

begin
  GermanEnglish:= True;
  Img_Background_01.Canvas.Brush.Color:= RGB(170,220,70);
  Img_Background_01.Canvas.Rectangle(-1,-1,Img_Background_01.Width+1,Img_Background_01.Height+1);

  Img_Background_02.Canvas.Brush.Color:= RGB(170,220,70);
  Img_Background_02.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  Img_BackgroundSwitchLanguage.Canvas.Brush.Color:= RGB(170,220,70);
  Img_BackgroundSwitchLanguage.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  Img_HeadingAmountBackground.Canvas.Brush.Color:= RGB(170,220,70);
  Img_HeadingAmountBackground.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  Img_HeadingRepititionsBackground.Canvas.Brush.Color:= RGB(170,220,70);
  Img_HeadingRepititionsBackground.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  L_HeadingRepititions.Font.Name:='Helvetica LT Std';
  L_HeadingRepititions.Font.Size:= 16;
  L_HeadingRepititions.Font.Color:= clWhite;
  CenterTextHeadingRepititions_1:= Form1.Width div 3;
  CenterTextHeadingRepititions_2:= L_HeadingRepititions.Width div 1;
  L_HeadingRepititions.Left:= CenterTextHeadingRepititions_1 + CenterTextHeadingRepititions_2;

  L_HeadingAmount.Font.Name:='Helvetica LT Std';
  L_HeadingAmount.Font.Size:= 16;
  L_HeadingAmount.Font.Color:= clWhite;
  CenterTextHeadingAmount_1:= Form1.Width div 4;
  CenterTextHeadingAmount_2:= L_HeadingAmount.Width div 2;
  L_HeadingAmount.Left:= CenterTextHeadingAmount_1 - CenterTextHeadingAmount_2;

  E_Amount.Font.Name:='Helvetica LT Std';
  E_Amount.Font.Size:= 16;
  E_Amount.Font.Color:= RGB(170,220,70);
  CenterTextHeadingAmount_1:= Form1.Width div 4;
  CenterTextHeadingAmount_2:= E_Amount.Width div 2;
  E_Amount.Left:= CenterTextHeadingAmount_1 - CenterTextHeadingAmount_2;

  L_HeadingMainMenu.Font.Name:='Helvetica LT Std';
  L_HeadingMainMenu.Font.Size:= 24;
  L_HeadingMainMenu.Font.Color:= clWhite;
  CenterTextHeadingMainMenu_1:= Form1.Width div 2;
  CenterTextHeadingMainMenu_2:= L_HeadingMainMenu.Width div 2;
  L_HeadingMainMenu.Left:= CenterTextHeadingMainMenu_1 - CenterTextHeadingMainMenu_2;

  L_SwitchLanguage.Font.Name:='Helvetica LT Std';
  L_SwitchLanguage.Font.Size:= 16;
  L_SwitchLanguage.Font.Color:= clWhite;
  CenterTextSwitchLanguage_1:= Form1.Width div 2;
  CenterTextSwitchLanguage_2:= L_SwitchLanguage.Width div 2;
  L_SwitchLanguage.Left:= CenterTextSwitchLanguage_1 - CenterTextSwitchLanguage_2;

  E_Repititions.Text:= '3';

end;

end.
Ja, das kann man sicherlich optimaler gestalten aber das ist in der Aufgabe nicht so wichtig (ist ja auch nur ein Schulfach, kein Informatik Studium). Ich muss aber den ganzen Quellcode in einem Vortrag erklären können.

Und hier der Quellcode zum Vokabeltrainer:

Delphi-Quellcode:
unit U_VocabularyTraining;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, JPEG;

type
  TForm2 = class(TForm)
    Bt_Compare: TButton;
    E_UserGuess: TEdit;
    Img_FeedBack: TImage;
    Img_Background_04: TImage;
    Img_Background_03: TImage;
    L_HeadingTrainer: TLabel;
    L_RemainingWords: TLabel;
    Img_BackgroundUnknownWord: TImage;
    L_UnknownWord: TLabel;
    L_CorrectAnswer: TLabel;
    Img_BackgroundCorrectAnswer: TImage;
    Img_FlagQuestion: TImage;
    Img_FlagAnswer: TImage;
    L_HeadingTrainerDescription: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Bt_CompareClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  var
    Vocabulary: TStringList;
    RandomNumber, Abfragen: Integer;
    jpgFlag, jpgCorrect, jpgWrong: TJpegImage;
    StartTime: TDateTime;
    Duration: TDateTime;
  end;

var
  Form2: TForm2;

implementation
uses
  U_MainMenu, U_Conclusion;

{$R *.dfm}

procedure TForm2.Bt_CompareClick(Sender: TObject);
var
  Input: String;
  Answer, RepetitionCheck: Integer;
  Form3: TForm3;

Begin
  If Vocabulary.Count > 0 Then

    Begin
      If GermanEnglish = True

      Then
        Begin
          Input:= E_UserGuess.Text;
          E_UserGuess.Text:= '';

          Answer:=AnsiCompareStr(Vocabulary.Names[RandomNumber], Input);

          If Answer=0
          Then
            Begin
              L_CorrectAnswer.Caption:='';
              Img_FeedBack.Picture.Bitmap.Assign(jpgCorrect);
              Vocabulary.Delete(RandomNumber);
            End

          Else
            Begin
              L_CorrectAnswer.Caption:='Deine Antwort: '+(Input)+' '+'Richtige Antwort: '+(Vocabulary.Names[RandomNumber]);
              Img_FeedBack.Picture.Bitmap.Assign(jpgWrong);

            End;

            RepetitionCheck:=RandomNumber;
            While RepetitionCheck = RandomNumber Do RandomNumber:=random(Vocabulary.Count);

            try
              L_UnknownWord.Caption:= Vocabulary.ValueFromIndex[RandomNumber];
              L_RemainingWords.Caption:= 'Verbleibende Vokabeln: '+IntToStr(Vocabulary.Count);
              L_RemainingWords.Font.Name:='Helvetica LT Std';
              L_RemainingWords.Font.Size:= 16;
              L_RemainingWords.Font.Color:= RGB(170,220,70);
              finally
            end;
        end

      Else
        Begin
          Input:= E_UserGuess.Text;
          E_UserGuess.Text:= '';

          Answer:=AnsiCompareStr(Vocabulary.ValueFromIndex[RandomNumber], Input);

          If Answer=0
          Then
            Begin
              L_CorrectAnswer.Caption:='';
              Img_FeedBack.Picture.Bitmap.Assign(jpgCorrect);
              jpgCorrect.free;
              Vocabulary.Delete(RandomNumber);
            End

          Else
            Begin
              L_CorrectAnswer.Caption:='Deine Antwort: '+(Input)+' '+'Richtige Antwort: '+(Vocabulary.ValueFromIndex[RandomNumber]);
              Img_FeedBack.Picture.Bitmap.Assign(jpgWrong);
              jpgWrong.free;
            End;

            RepetitionCheck:=RandomNumber;
            While RepetitionCheck = RandomNumber Do RandomNumber:=random(Vocabulary.Count);

            try
              L_UnknownWord.Caption:= Vocabulary.Names[RandomNumber];
              L_RemainingWords.Caption:= 'Verbleibende Vokabeln: '+IntToStr(Vocabulary.Count);
              L_RemainingWords.Font.Name:='Helvetica LT Std';
              L_RemainingWords.Font.Size:= 16;
              L_RemainingWords.Font.Color:= RGB(170,220,70);
              finally
            end;
        End;
    End

  Else
    Begin
      FormDestroy(Vocabulary);
    End;
End;


procedure TForm2.FormCreate(Sender: TObject);
var
  CenterTextHeadingTrainer_1, CenterTextHeadingTrainer_2,
  CenterTextHeadingTrainerDescription_1, CenterTextHeadingTrainerDescription_2,
  CenterTextRemainingWords_1, CenterTextRemainingWords_2: Integer;

begin
   //Color := RGB(170,220,70); //Hintergrund grün
   //P_Question.Color := RGB(255,255,255); //Fragefeld Hintergrund weiß
   //P_Answer.Color := RGB(255,255,255); //Antwortfeld Hintergrund weiß

  Img_Background_03.Canvas.Brush.Color:= RGB(170,220,70);
  Img_Background_03.Canvas.Rectangle(-1,-1,Img_Background_03.Width+1,Img_Background_03.Height+1);

  Img_Background_04.Canvas.Brush.Color:= RGB(170,220,70);
  Img_Background_04.Canvas.Rectangle(-1,-1,Img_Background_04.Width+1,Img_Background_04.Height+1);

  Img_BackgroundUnknownWord.Canvas.Brush.Color:= RGB(170,220,70);
  Img_BackgroundUnknownWord.Canvas.Rectangle(-1,-1,Img_BackgroundUnknownWord.Width+1,Img_BackgroundUnknownWord.Height+1);

  Img_BackgroundCorrectAnswer.Canvas.Brush.Color:= RGB(220,220,220);
  Img_BackgroundCorrectAnswer.Canvas.Rectangle(-1,-1,Img_BackgroundCorrectAnswer.Width+1,Img_BackgroundCorrectAnswer.Height+1);

  L_HeadingTrainer.Font.Name:='Helvetica LT Std';
  L_HeadingTrainer.Font.Size:= 24;
  L_HeadingTrainer.Font.Color:= clWhite;
  CenterTextHeadingTrainer_1:= Form1.Width div 2;
  CenterTextHeadingTrainer_2:= L_HeadingTrainer.Width div 2;
  L_HeadingTrainer.Left:= CenterTextHeadingTrainer_1 - CenterTextHeadingTrainer_2;

  L_HeadingTrainerDescription.Font.Name:='Helvetica LT Std';
  L_HeadingTrainerDescription.Font.Size:= 16;
  L_HeadingTrainerDescription.Font.Color:= clWhite;
  CenterTextHeadingTrainerDescription_1:= Form1.Width div 5;
  CenterTextHeadingTrainerDescription_2:= L_HeadingTrainerDescription.Width div 2;
  L_HeadingTrainerDescription.Left:= CenterTextHeadingTrainerDescription_1 - CenterTextHeadingTrainerDescription_2;

  L_RemainingWords.Caption:= 'Verbleibende Vokabeln: 3';
  L_RemainingWords.Font.Name:='Helvetica LT Std';
  L_RemainingWords.Font.Size:= 16;
  L_RemainingWords.Font.Color:= RGB(170,220,70);
  CenterTextRemainingWords_1:= Form1.Width div 2;
  CenterTextRemainingWords_2:= L_RemainingWords.Width div 2;
  L_RemainingWords.Left:= CenterTextRemainingWords_1 - CenterTextRemainingWords_2;

  jpgCorrect:= TJpegImage.Create;
  jpgCorrect.LoadFromFile('True.jpg');

  jpgWrong:= TJpegImage.Create;
  jpgWrong.LoadFromFile('False.jpg');

  StartTime := Now;

  Vocabulary:= TStringList.Create;
  Vocabulary.LoadFromFile('Vocabulary.txt');

  RandomNumber:= random(Vocabulary.Count);
  L_RemainingWords.Caption:= 'Verbleibende Vokabeln: '+IntToStr(Vocabulary.Count);

  If GermanEnglish = True

  Then
    try
      L_HeadingTrainerDescription.Caption:= 'Deutsch -> Englisch | '+IntToStr(Repititions)+' Abfragen | 10 Vokabeln';

      jpgFlag := TJpegImage.Create;
      jpgFlag.LoadFromFile('GermanFlag.jpg');
      Img_FlagQuestion.Picture.Bitmap.Assign(jpgFlag);
      jpgFlag.free;

      jpgFlag := TJpegImage.Create;
      jpgFlag.LoadFromFile('BritishFlag.jpg');
      Img_FlagAnswer.Picture.Bitmap.Assign(jpgFlag);
      jpgFlag.free;

      L_UnknownWord.Caption:= Vocabulary.ValueFromIndex[RandomNumber];
      L_CorrectAnswer.Caption:= '';
      finally
    end

  Else
    try
      L_HeadingTrainerDescription.Caption:='Englisch -> Deutsch | '+IntToStr(Repititions)+' Abfragen | 10 Vokabeln';

      jpgFlag := TJpegImage.Create;
      jpgFlag.LoadFromFile('BritishFlag.jpg');
      Img_FlagQuestion.Picture.Bitmap.Assign(jpgFlag);
      jpgFlag.free;

      jpgFlag := TJpegImage.Create;
      jpgFlag.LoadFromFile('GermanFlag.jpg');
      Img_FlagAnswer.Picture.Bitmap.Assign(jpgFlag);
      jpgFlag.free;

      L_UnknownWord.Caption:= Vocabulary.Names[RandomNumber];
      L_CorrectAnswer.Caption:= '';
      finally
    End;

end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  Vocabulary.Free;
  jpgWrong.free;
  jpgCorrect.free;

  Form3 := TForm3.Create(self);
      try
        Form3.ShowModal;
      finally
        Form3.Free;
      end;
end;

end.
Das letzte Fenster hat noch nicht viel Code. In Delphi ist der Code deutlich übersichtlicher, da um Begin und End noch eine Farbige Klammer ist.

Geändert von KetchUp (18. Nov 2018 um 13:17 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#48

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 13:18
Zitat:
Vergleiche auf TRUE ... kann in die Hose gehen
Nun dann sollte Detlef es richtig machen, wenn schon.
Ich verwende die variable Boolean schon seit ewigen gedenken nicht mehr. (abgesehen von VB5 und aufwärts)
Wenn schon dann LongBool oder die verkürzte form BOOL = LongBool.

In der heutigen zeit noch auf Boolean zu vergleichen ist für mich genauso ein Unding.
Aber gut gehört nicht direkt zum Thema.

gruss

Geändert von EWeiss (18. Nov 2018 um 13:28 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#49

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 14:04
Die Stringliste wird im TForm2.FormCreate erstellt und in TForm2.FormDestroy freigeben.

Eine Freigabe irgendwo "unterwegs" ist schlicht und einfach falsch.

Auch der Aufruf von FormDestroy ist nicht wirklich zielführend, da hier alles ausgeführt wird, was bei der Freigabe des Formulares erforderlich ist.

Im FormDestroy ein weiteres Formular zu öffnen, halte ich nicht für sinnvoll.

Mache Dir bitte eine Methode, die zum Ende, wenn das Vokabeltraining erfolgreich abgeschlossen wurde, aufgerufen wird. In der Methode kannst Du dann das Form3 erstellen und anzeigen.

FormDestroy enthält nur dashier:
Delphi-Quellcode:
procedure TForm2.FormDestroy(Sender: TObject);
begin
  Vocabulary.Free;
  jpgWrong.free;
  jpgCorrect.free;
end;
In einer weiteren Methode, z. B.: Erfolgsmeldung, steht dann sowas in der Art:
Delphi-Quellcode:
procedure TForm2.Erfolgsmeldung(Sender: TObject);
begin
  Form3 := TForm3.Create(self);
  try
    Form3.ShowModal;
  finally
    Form3.Free;
  end;
end;
Oben in der Unit musst Du dann noch etwas ergänzen:
Delphi-Quellcode:
...
    procedure FormCreate(Sender: TObject);
    procedure Bt_CompareClick(Sender: TObject);
    procedure Erfolgsmeldung(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
...
An der Stelle, an der Du momentan FormDestroy(Vocabulary); stehen hast, ruftst Du dann die Methode Erfolgsmeldung(self); auf.

Danach sollte (hoffentlich) das "unmotivierte" Beenden des Programmes oder die Folgefehler der Stringlistenfreigabe, behoben sein.

Dafür
Zitat von ketchup:
ohne wirklich Ahnung von Delphi zu haben
sieht es meiner Meinung nach garnichtmal so übel aus.

Klar kann man da noch was verbesssern, aber mir ist im Laufe meines Lebens noch kein Programm untergekommen, an dem man nicht noch irgendwas verbessern könnte. Mit der Zeit wird man besser und mag eventuell das eine oder andere, was man gemacht hat, nicht mehr wirklich anschauen.

Sorg' erstmal dafür, dass das Programm so funktioniert, wie Du Dir es vorstellst. Dann schaust Du, ob es irgendwelche Quelltexte gibt, die in (fast) identischer Form, mehrfach vorkommen. Daraus machst Du dann Methoden, die Du entsprechend aufrufst. Dadurch wird der Quelltext leichter lesbar.

Ungetesteter Vorschlag:
aus
Delphi-Quellcode:
  Img_Background_01.Canvas.Brush.Color:= RGB(170,220,70);
  Img_Background_01.Canvas.Rectangle(-1,-1,Img_Background_01.Width+1,Img_Background_01.Height+1);

  Img_Background_02.Canvas.Brush.Color:= RGB(170,220,70);
  Img_Background_02.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  Img_BackgroundSwitchLanguage.Canvas.Brush.Color:= RGB(170,220,70);
  Img_BackgroundSwitchLanguage.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  Img_HeadingAmountBackground.Canvas.Brush.Color:= RGB(170,220,70);
  Img_HeadingAmountBackground.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);

  Img_HeadingRepititionsBackground.Canvas.Brush.Color:= RGB(170,220,70);
  Img_HeadingRepititionsBackground.Canvas.Rectangle(-1,-1,Img_Background_02.Width+1,Img_Background_02.Height+1);
machen wir sowas in der Art:
Delphi-Quellcode:
procedure TForm1.DefaultImg(Img1 : TImage; Img2 : TImage);
begin
  Img1.Canvas.Brush.Color := RGB(170,220,70);
  Img1.Canvas.Rectangle(-1,-1,Img2.Width + 1,Img2.Height + 1);
end;
und statt obiger vielen Zeilen, wird daraus dann sowas in der Art:
Delphi-Quellcode:
  DefaultImg(Img_Background_01,Img_Background_01);
  DefaultImg(Img_Background_02,Img_Background_02);
  DefaultImg(Img_BackgroundSwitchLanguage,Img_Background_02);
  DefaultImg(Img_HeadingAmountBackground,Img_Background_02);
  DefaultImg(Img_HeadingRepititionsBackground,Img_Background_02);
In den ersten beiden Zeilen wird die Methode mit zwei identischen Parametern aufgerufen, das kann man sicherlich auch noch verbessern, in dem man eine überladene Methode erstellt, ... aber das kommt später
  Mit Zitat antworten Zitat
KetchUp

Registriert seit: 16. Nov 2018
31 Beiträge
 
#50

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 21:33
Vielen Dank, jetzt bin ich schon ein großen Schritt weiter. Ich hab jetzt auch das Problem des Absturzes ausgemacht.

Code:
RepetitionCheck:=RandomNumber;
While RepetitionCheck = RandomNumber Do RandomNumber:=random(Vocabulary.Count);
Ich wollte verhindern, dass dieselbe Vokabel zwei mal hintereinander abgefragt wird und hab mir damit ne Endlosschleife gebaut, wenn nur noch eine Vokabel vorhanden ist.

Wie erfahre ich denn jetzt welche die Letzte übrig gebliebene Vokabel ist, nachdem alle anderen zufällig mit .Delete entfernt wurden?

Ich dachte sie müsste den Index 0 haben, das gibt aber ein "out of bounds" zurück.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 11   « Erste     345 67     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz