Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   200+ Texte in ein memo laden (https://www.delphipraxis.net/173314-200-texte-ein-memo-laden.html)

Spectre 16. Feb 2013 23:11

200+ Texte in ein memo laden
 
Hallo!

Ich code ein geographielernprogramm.
Ich möchte wenn ein jeweiliges land auf der karte angewählt ist, den dazugehörigen text (hauptstadt, länderspezifische informationen etc) in einem memo anzeigen. die texte zu jedem land hab ich schon in über 200 txt dateien abgespeichert...

wenn ich nicht 200+ memos erstellen will und die txt dateien dem user nicht zur verfügung stellen will( via loadfromfile) wie binde ich diese ein? wenn ich nicht recht irre nutzt eine .res file auch nur quellen oder?
am liebsten wäre es mir, ich könnte alle 200 texte in eine dll laden und auf diese zugreifen, dann müsste ich nur die exe und die dll bereitstellen, lässt sich das machen?
wenn ja ne idee wie?


bin für alle vorschläge offen, wie würdet ihr das problem lösen haufenweise texte in nur einem memo darzustellen?

dank!!

lg aus hamburg
robin

Perlsau 16. Feb 2013 23:23

AW: 200+ Texte in ein memo laden
 
Wenn du alle benötigten Dateien zipst, mußt du nur ein Zip-File übergeben ...

Was spricht dagegen, mit Text-Dateien zu arbeiten? Du benennst die Textdateien nach dem Land (z.B. Deutschland.txt) und lädst die nach Bedarf mit LoadFromFile in dein Memo.

Du könntest aber auch eine Datenbank einsetzen, wenn du nicht willst, daß der Anwender die Texte manipulieren kann. Eine DLL zu verwenden halte ich für unnötig und zudem für zu kompliziert, vor allem, wenn du Korrekturen an den Texten vornehmen mußt.

RWarnecke 17. Feb 2013 06:36

AW: 200+ Texte in ein memo laden
 
Mein Vorschlag wäre hier eine Datenbank (z.B. SQLite) zu nehmen, wie mein Vorredner es schon vorgeschlagen hat oder die Texte in eine Resources packen und dann die Resources entweder ins Programm oder doch in eine DLL. So brauchst Du bei der Resources nur die DLL oder die EXE auszutauschen, wenn Du Änderungen vornimmst.

dataspider 17. Feb 2013 08:13

AW: 200+ Texte in ein memo laden
 
Hi,

der Weg über Datenbank ist sicher der bessere.
Aber es ist auch relativ easy mit einer DLL machbar.

Eine Datei z.B. laender.rc

dort für jede Textdatei eine Zeile: TEXT_DE RCDATA "deutschland.txt"

Eine dpr:
Delphi-Quellcode:
library land_data;
{$R *.res}
begin
end.
kompilieren:
brcc32.exe laender.rc
dcc32 land_data.dpr

In den Sourcen:

Delphi-Quellcode:
procedure DeinForm.LadeMemo(ABlockName: string);
Var
  AStream: TResourceStream;
  AHandle: THandle;
  ADllFileName: string;
begin
  ADllFileName := 'land_data.dll';
  AHandle := LoadLibraryEx(PChar(ADllFileName), 0, LOAD_LIBRARY_AS_DATAFILE);
  if AHandle > HINSTANCE_ERROR then
  begin
    try
      AStream := TResourceStream.Create(AHandle, ABlockName, RT_RCDATA);
      try
        if AStream.Size > 0 then
        begin
          AStream.Position := 0;
          DeinMemo.LoadFromStream(AStrem);
        end;
      finally
        AStream.Free;
      end;
    finally
      FreeLibrary(AHandle);
    end;
  end
  else
    //
    { TODO : Fehlerausgabe }
end;
Aufruf z.B.
LadeMemo('TEXT_DE');

Alles ungetestet...


Frank

WInfo 17. Feb 2013 09:32

AW: 200+ Texte in ein memo laden
 
Moin Moin Robin,

denke dein Programm sollte einigermassen robust sein, somit würde ich vor der Verwendung von +200 Textdateien Abstand halten. Wenn Du die Texte nicht direkt in deine App integrieren möchtest und wohl noch weitere Infos dazu kommen, bleiben prinzipiell die folgenden Möglichkeiten über:
  • mitliefern in einer DB (bspw. SQL Lite)
  • über eine Ini Datei
  • Textdatei mit speziellen Trennzeichen (bspw. @@ für neues Land)
  • XML Datei
  • DLL bspw. Ressourcen DLL
  • als Binary (Serialisierung)

Für die Serialisierung noch kurz eine Erläuterung, du brauchst eine Objektstruktur für die Darstellung deiner Länder in deinen Programm. Diese rüstest du dann mit zwei Methoden aus, Save2Stream und ReadFromStream. In die App welche du auslieferst, nimmst du nur die Methode ReadFromStream auf. Dann baust du dir noch ein zweites Prog mit der selben Objektstruktur (eine gemeinsame Codebasis), welches du mit der Pflege der Daten betraust, diese schreibt dann über Save2Stream alle benötigten Daten in eine Datei (kannst binär, als XML, in eine DB oder wie auch immer) ausgeben.

That's all.

p80286 17. Feb 2013 10:20

AW: 200+ Texte in ein memo laden
 
Ich würde die eine Textdatei wählen. Wobei natürlich eine gewisse Struktur genutzt werden sollte (z.b. xml).

Gruß
K-H

Furtbichler 17. Feb 2013 10:52

AW: 200+ Texte in ein memo laden
 
Sagen wir, deine Text-Datei sieht so aus:
Code:
@@Deutschland
Hier ist der
Text
für die
Bundesrepublik
@@England
Und hier für UK
..
Dann liest Du diese Datei in eine TStringList ein...
Delphi-Quellcode:
Var
  MyCountryDescriptions : TStringList;
...

MyCountryDescriptions.LoadFromFile('Laender.TXT');
Einen Beschreibungstext kannst Du so bekommen:
Delphi-Quellcode:
Procedure CopyCountryDescription(Const Country : String; Description : TStrings);
Var
  i : Integer;

Begin
  Description.Clear;
  i:= MyCountryDescriptions.IndexOf('@@'+Country);
  if i=-1 then exit; // Keine Beschreibung gefunden
  inc(i);
  Description.BeginUpdate;
  Try
    while (i<MyCountryDescriptions.Count) do
      if Copy(MyCountrDescriptions[i],1,2) <> '@@' then
        break
      else begin
        Description.Add(MyCountrDescriptions[i]);
        inc(i);
      end
  finally
    Description.EndUpdate;
  end
end;
...
// Aufruf z.B. so
  CopyCountryDescription('Deutschland',Memo1.Lines);
Das wäre jetzt für Dich die einfachste Möglichkeit. So kannst Du die Datei auch jederzeit erweitern.

Spectre 17. Feb 2013 14:42

AW: 200+ Texte in ein memo laden
 
danke für die tipps!!

auch wenn ich die texte ungerne zur verfügung stelle, verstehe ich zuwenig von datenbanken bzw XML um das realistisch zu verwirklichen..
ich dein beispiel eben mal ausprobiert furtbichler, bin mir allerdings nicht sicher wo ich

Code:
MyCountryDescriptions.LoadFromFile('C:\irgendeinpfad\land.TXT');
einfügen muss? egal wo ich es probiere, ich kriege ne exception ("zugriffsverletzung bei adresse ....)
in dem moment wo diese zeile ausgelöst wirdm (ob auf buttondruck oder im formcreate). hast nen tip?

robin

Perlsau 17. Feb 2013 14:49

AW: 200+ Texte in ein memo laden
 
Zitat:

Zitat von Spectre (Beitrag 1203978)
Code:
MyCountryDescriptions.LoadFromFile('C:\irgendeinpfad\land.TXT');

Dann hast du wohl die Stringliste noch nicht erzeugt:
Delphi-Quellcode:
MyCountryDescriptions := TStringList.Create;

Und nicht vergessen, die Stringliste am Ende wieder freizugeben:
Delphi-Quellcode:
FreeAndNil(MyCountryDescriptions);

Spectre 17. Feb 2013 15:11

AW: 200+ Texte in ein memo laden
 
gleiches problem :S

hier mal der ganze code. nur ein memo (memo1) und nen button auf der form..pfad ist auch korrekt und das land richtig in der txt benannt nach @@ :o

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    MyCountryDescriptions : TStringList;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
    MyCountryDescriptions : TStringList;


implementation

{$R *.dfm}

Procedure CopyCountryDescription(Const Country : String; Description : TStrings);
Var
  i : Integer;
Begin

  Description.Clear;
  i:= MyCountryDescriptions.IndexOf('@@'+Country);
  if i=-1 then exit; // Keine Beschreibung gefunden
  inc(i);
  Description.BeginUpdate;
  Try
    while (i<MyCountryDescriptions.Count) do
      if Copy(MyCountryDescriptions[i],1,2) <> '@@' then
        break
      else begin
        Description.Add(MyCountryDescriptions[i]);
        inc(i);
      end
  finally
    Description.EndUpdate;
  end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyCountryDescriptions := TStringList.Create;
MyCountryDescriptions.LoadFromFile('C:\MeinPfad\land.TXT');
CopyCountryDescription('Deutschland',Memo1.Lines);
FreeAndNil(MyCountryDescriptions);
end;

end.
Hab create, loadfromfile und freigabe dem button übergeben ist das ok?

lbccaleb 17. Feb 2013 15:33

AW: 200+ Texte in ein memo laden
 
2x verwendet:

Delphi-Quellcode:
  private
    MyCountryDescriptions : TStringList;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
    MyCountryDescriptions : TStringList;

Dadurch dass du die Stringlist ja die ganze Zeit über in Benutzung hast, wie das Programm läuft, ist es vllt besser für dich musst du die Stringlist im Form.OnCreate erzeugen und erst im Form.Close wieder freigeben, da Sie sonst in der Procedure nicht initzialisiert ist.


Edit2:

Enferne die Version aus dem Privat Abschnitt, da sonnst die Procedure:
Delphi-Quellcode:
Procedure CopyCountryDescription(Const Country : String; Description : TStrings);
Kein Zugriff auf die Variable hat.

Volker Z. 17. Feb 2013 15:34

AW: 200+ Texte in ein memo laden
 
Hallo,

überleg Dir doch mal welche Eigenschaft Du in Button1Click initialisierst und auf welche Variable Du in CopyCountryDescription zugreifst, dann sollte Dir schnell klar werden warum es beim Zugriff auf MyCountryDescriptions.IndexOf('@@'+Country) scheppert.

Gruß

Sir Rufo 17. Feb 2013 17:24

AW: 200+ Texte in ein memo laden
 
Hat schon mal jemand Delphi-Referenz durchsuchenTClientDataSet in den Raum geworfen?

Für die Erstellung/Bearbeitung müsste man ein lüttes Progrämmle zusätzlich schreiben, der Aufwand hält sich in Grenzen und die Suche nach den Ländernamen sollte dank Index und InMemory auch sehr flott vonstatten gehen.

Im MyBase-Format gespeichert sollte es auch halbwegs "unleserlich" sein ;)

BTW: Hier ein Tutorial

Furtbichler 17. Feb 2013 17:30

AW: 200+ Texte in ein memo laden
 
Zitat:

Zitat von Sir Rufo (Beitrag 1204020)
Hat schon mal jemand Delphi-Referenz durchsuchenTClientDataSet in den Raum geworfen?

Nein, aber das ist wirklich eine einfache Möglichkeit.

Spectre 18. Feb 2013 21:29

AW: 200+ Texte in ein memo laden
 
danke rufo für den link!
ich habs geschafft in ne binäre .cds datei daten zu speichern und zu laden, da sind sie vor manipulationsversuchen (zumindest für die meisten) ein bischen sicherer. aber wie kriege ich die daten aus dem DBGrid ins memo?? erst für jedes land ne zeile im grind definieren und dann aus der zeile (bzw der id) lesen und ins memo übertragen?

lg robin

Sir Rufo 18. Feb 2013 22:00

AW: 200+ Texte in ein memo laden
 
Das DBGrid braucht man nur zur Anzeige. Die Daten selber befinden sich im DataSet. Also auch nur das DataSet fragen.

Delphi-Referenz durchsuchenTDataSet.Locate und Delphi-Referenz durchsuchenTDataSet.FieldByName sind dein Freund ;)

Spectre 18. Feb 2013 22:03

AW: 200+ Texte in ein memo laden
 
ich probiers morgen mal aus, danke!

Spectre 18. Feb 2013 22:19

AW: 200+ Texte in ein memo laden
 
hmm...wie initialisiere ich das?

Code:
memo1.Text := clientdataset1.FieldByName('C:\MEINPFAD\test2.cds')
funktioniert natürlich wenig hilfreich xD
sorry ich bin ein absoluter anfänger was solche binären daten angeht...hast du nen beispielcode wie ich auf spezielle IDs zugreife mit dem memo hab das tutorial soweit durchgearbeitet und ein memo1 der form hinzugefügt, aber wie greife ich auf die IDs zu?

Spectre 27. Feb 2013 11:44

AW: 200+ Texte in ein memo laden
 
könnt ihr hier bitte nochmal einen blick draufwerfen? hab nur nen button und ein memo im programm.
ich habe die stringlist deklariert, create ist auch drin, aber es passiert auf knopfdruck....einfach mal gar nichts. die fehlermeldung zumindest ist weg..was mache ich falsch?
land.txt mitsamt @@deutschland und text existiert natürlich.

Code:
var
  Form1: TForm1;
   MyCountryDescriptions : TStringList;


implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(MyCountryDescriptions);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyCountryDescriptions := TStringList.Create;
end;

Procedure CopyCountryDescription(Const Country : String; Description : TStrings);
Var
  i : Integer;

Begin

  Description.Clear;
  i:= MyCountryDescriptions.IndexOf('@@'+Country);
  if i=-1 then exit; // Keine Beschreibung gefunden
  inc(i);
  Description.BeginUpdate;
  Try
    while (i<MyCountryDescriptions.Count) do
      if Copy(MyCountryDescriptions[i],1,2) <> '@@' then
        break
      else begin
        Description.Add(MyCountryDescriptions[i]);
        inc(i);
      end
  finally
    Description.EndUpdate;
  end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyCountryDescriptions.LoadFromFile('C:\Games\land.TXT');   //der pfad ist hier richtig plaziert?
CopyCountryDescription('deutschland',Memo1.Lines);
end;

end.
danke!

Bummi 27. Feb 2013 11:52

AW: 200+ Texte in ein memo laden
 
Du hast einen Flüchtigkeitsfehler drin

Delphi-Quellcode:
 if Copy(MyCountryDescriptions[i],1,2) = '@@' then // statt <>

Spectre 27. Feb 2013 12:02

AW: 200+ Texte in ein memo laden
 
danke bummi.
es passiert aber leider immer noch nichts :S

DeddyH 27. Feb 2013 12:06

AW: 200+ Texte in ein memo laden
 
Dann stepp doch einfach mal durch (Haltepunkt setzen und mit F7/F8 weiterschalten).

Spectre 27. Feb 2013 12:18

AW: 200+ Texte in ein memo laden
 
ist nicht wirklich ergiebig...wobei das problem sicherlich zwischen meinen ohren sitzt und ich zuwenig von delphi-interna verstehe ;)
ich finde diesen lösungsansatz für mich sehr praktisch, liegt der fehler im code der prozedur selbst vlt? :F

DeddyH 27. Feb 2013 12:23

AW: 200+ Texte in ein memo laden
 
Du findest es praktischer, wenn wir Deine Fehler suchen, oder wie ist das zu verstehen?

Davidlocke13 27. Feb 2013 12:35

AW: 200+ Texte in ein memo laden
 
200 txt dateien mach doch eine Datenbnak Datei die du dran hängst an dein Programm :wink:

Spectre 27. Feb 2013 13:30

AW: 200+ Texte in ein memo laden
 
Zitat:

Zitat von DeddyH (Beitrag 1205270)
Du findest es praktischer, wenn wir Deine Fehler suchen, oder wie ist das zu verstehen?

Hättest du bei Seite 1 des Topics angefangen Deddy wäre es offensichtlich das Furtbichler der vater diesen codes ist und er diese variante vorgeschlagen hat. :wink:
ich versuche nur sie zum laufen zu kriegen, irgendwo ist der wurm drin :F

DeddyH 27. Feb 2013 13:32

AW: 200+ Texte in ein memo laden
 
Genau, und deshalb schaut man im Debugger nach, was da schief läuft.

[edit]http://www.delphipraxis.net/41047-tu...ortgeschr.html[/edit]

Spectre 27. Feb 2013 16:59

AW: 200+ Texte in ein memo laden
 
jo danke für den link. hab bis jetzt rumprobiert, hat lange genug gedauert..
habs jetzt mit einer .res file gelöst in die ich die textfiles einspeise und mit

Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  rs: TResourceStream;
  begin
  rs := TResourceStream.Create(hinstance, 'ELFENBEINKUESTE', RT_RCDATA);
  try
  smemo1.Lines.LoadFromStream(rs);
  finally
    rs.Free;
  end;
end;
drauf zugreife. Das war ein Akt :?
Aber der lerneffekt war gut :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz