Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SaveToFile [TStringgrid] ohne Tsavedialog (https://www.delphipraxis.net/69126-savetofile-%5Btstringgrid%5D-ohne-tsavedialog.html)

danku 10. Mai 2006 15:12


SaveToFile [TStringgrid] ohne Tsavedialog
 
Ich möchte nur die 1.Spalte einer TStringGrid speichern. Es soll kein Tsavedialog geoeffnet werden.
ich arbeite ohne Tstrings!

ausgelesen mit:

Delphi-Quellcode:
sgfiles.RowCount := OpenDialog1.Files.Count + 1;
   for i:=0 to Opendialog1.files.count -1 do
   begin
   sgfiles.cells[0,1 + i]:= (OpenDialog1.Files[i]);
   Savedialog1.InitialDir:=GetCurrentDir;
Versuch des Speicherns:

Delphi-Quellcode:
Savedialog1.InitialDir:=GetCurrentDir;
   for i:= 0 to sgfiles.rowcount-1 do
   sgfiles.rows.SaveToFile('GetCurrentDir' + sgfiles.Cells[0,i].AsString);
// klassentyp oder recordtyp wird erfordet. ich weiß. for i := 0 to sl.Count - 1 do aber kann ich das auch ohne eine Tstringlist realisieren? wenn ja wie?

marabu 10. Mai 2006 15:41

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Probiere es so:

Delphi-Quellcode:
var
  fn: TFileName;
begin
  fn := IncludeTrailingPathDelimiter(GetCurrentDir)
      + 'demo.txt';
  with sgFiles do
    Cols[FixedCols].SaveToFile(fn);
end;
Grüße vom marabu

TeronG 10. Mai 2006 15:42

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Zitat:

Zitat von danku
Es soll kein Tsavedialog geoeffnet werden.

muss ja auch nicht .. der is ja nur da, damit der User nen ort angeben kann.
Wenn du dich dazu überwinden könntest eine TStringList zu nehmen könntest du mit .SaveToFile() arbeiten.
EDIT: :oops: ach ja .. und wenn nicht dann hilft evtl. das hier bzw. [dp]Dyn* Array Speichern[/dp]

EDIT2: :shock: ach man kann sogar
Delphi-Quellcode:
Cols[FixedCols].SaveToFile(fn);
machen?? cool :mrgreen:

danku 10. Mai 2006 18:09

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Zitat:

Zitat von marabu
Probiere es so:

Delphi-Quellcode:
var
  fn: TFileName;
begin
  fn := IncludeTrailingPathDelimiter(GetCurrentDir)
      + 'demo.txt';
  with sgFiles do
    Cols[FixedCols].SaveToFile(fn);
end;
Grüße vom marabu


wofür steht die demo.txt?
außerdem funzt deine methode nicht :gruebel:

marabu 10. Mai 2006 19:09

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Hallo Daniel,

Zitat:

Zitat von danku
wofür steht die demo.txt?

es ist nur ein Platzhalter - ich dachte du würdest selbst die noch nötigen Änderungen machen. Immerhin hast du Pascal als eines deiner Wissensgebiete angegeben.

Zitat:

Zitat von danku
außerdem funzt deine methode nicht

Es ist höchst unwahrscheinlich, aber was wäre, wenn du einen Fehler bei der Anwendung der Methode gemacht hättest?

Delphi-Quellcode:
uses
  StrUtils;

function SaveColumn(sg: TStringGrid; index: Integer; keepHeader: Boolean = false): Boolean;
var
  fn: TFileName;
begin
  Result := false;
  if sg.RowCount = 0 then
    Exit;
  with TStringList.Create do
  try
    Assign(sg.Cols[index]);
    fn := IncludeTrailingPathDelimiter(GetCurrentDir)
        + Strings[0];
    if not keepHeader then
      Delete(index);
    SaveToFile(fn);
    Result := true;
  finally
    Free;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  ShowMessage(IfThen(SaveColumn(StringGrid, 0), 'holiday', 'kill the cat'));
end;
Freundliche Grüße vom marabu

danku 10. Mai 2006 21:30

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
klar das mit dem platzhalter ist mir schon klar aber für mich sieht der überlüssig aus. d.h. der ist gar nicht notwendig.
zum code:
ich meine theoretisch müsste der ja speichern aber praktisch sieht das ganz anders aus.

inhalt von cells[0,1]:='D:\+MUSIK\ashanti_-_cant_stop.mp3'

der speichert nicht obwohl ich noch geaddet habe:
Delphi-Quellcode:
Savedialog1.InitialDir:=GetCurrentDir;
damit der weiß in welchen ordnern!

muss vll. das alles vor '\' weg?

marabu 11. Mai 2006 06:58

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Guten Morgen.

Du hast geschrieben, dass du ohne einen SaveDialog speichern möchtest - dann lasse diese Komponente auch einfach weg. Es hilft nicht, wenn du die Eigenschaft InitialDir von SaveDialog auf GetCurrentDir setzt, da die Komponente diese Information nur verwendet um das Navigieren im Dateisystem zu vereinfachen. Den absoluten Dateinamen kannst du einfach bei SaveToFile() selbst eintragen. Dazu kannst du ein Verzeichnis und einen relativen Dateinamen verknüpfen - aber nicht zwei absolute Angaben.

Ich habe jetzt das Gefühl, dass du garnicht den Inhalt der ersten Spalte deines StringGrids speichern willst. Außerdem ist es nicht sinnvoll die Zeichenketten aus deinem StringGrid in eine Datei mit der Erweiterung MP3 zu schreiben. Das Beste wird sein, wenn du mal einen screen shot von deinem StringGrid mit ein paar Daten anhängst und dazu genau beschreibst, was du erreichen willst.

Freundliche Grüße

marabu

danku 11. Mai 2006 07:35

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Liste der Anhänge anzeigen (Anzahl: 1)
naja man kann die dateien über einen topendialog in die tstringgrid laden.
das dumme ist noch, dass der komplette pfad mit in die zellen eingebunden wird.

der wiedergebene inhalt des topendialogs steht in spalte 1.
in spalte 2 steht der originalname der date und in der 2.spalte die dateigrössse.

anhand eines filters kann man die funktion "sonderzeichen entfernen" erweitern.
weitere methoden sind: großschreibung der wörter (in spalte 1) und das ganze in Winamp öffnen.

mein problem besteht noch bei der save-methode.

bild meines progs ist im anhang

marabu 11. Mai 2006 08:18

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Wenn du einen vollständigen Dateinamen hast und möchtest den Namen ohne Pfadanteil, dann verwende die Funktion ExtractFileName().

Meine Speicherroutine in Beitrag #5 geht aufgrund von Informationslücken davon aus, dass der Dateiname in der Titelzeile steht. Hier jetzt eine angepasste Version, der du den Speichernamen mitgeben kannst:

Delphi-Quellcode:
uses
  StrUtils;

function SaveColumn(fn: TFileName; sg: TStringGrid; index: Integer;
  keepHeader: Boolean = false): Boolean;
begin
  Result := false;
  if sg.RowCount = 0 then
    Exit;
  with TStringList.Create do
  try
    Assign(sg.Cols[index]);
    if not keepHeader then
      Delete(index);
    SaveToFile(fn);
    Result := true;
  finally
    Free;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  ShowMessage(IfThen(SaveColumn('playlist.txt', StringGrid, 0), 'holiday', 'kill the cat'));
end;
marabu

danku 11. Mai 2006 13:13

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
jetzt weiß ich erst mal was du meinst :)

ich will nicht die spalte1 in einer txt(dein platzhalter ;)) speichern sondern die dateien, die man per topendialog in die 1.spalte lädt, die dateien sollen gespeichert werden. (z.b. wenn man eben sonderzeichen entfernt und speichern drückt, dann soll die urspgs.datei umbenannt werden.

wieso speichert der überhaupt deine .txt in den ordner, wo die mp3s sind?

TeronG 11. Mai 2006 13:43

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
:gruebel:
Ich dachte, du möchtest den inhalt des Grid's speichern.
Aber du willst nur die "alte Datei" unter neuem/korigiertem namen speichern oder wie?

danku 11. Mai 2006 13:52

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
ja sry wenn ich mich falsch ausgedrückt habe.
*missverständnis

TeronG 11. Mai 2006 16:06

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
ohh .. aso ... dann sollte sowas passen

Delphi-Quellcode:
var
  AlteDatei, NeueDatei : String;

...
...

  for i := 0 to StringGrid1.RowCount-1 do
  begin
    AlteDatei := StringGrid1.Cells[0,i]; //die spalte mit dem alten namen des Opendialogs eintragen
    NeueDatei := StringGrid1.Cells[1,i]; //Die Spalte mit dem neuen bereinigten Namen eigragen
    MoveFile(AlteDatei,NeueDatei); // falls die alte Datei bleiben soll dann CopyFile();

    //MoveFile(StringGrid1.Cells[0,i],StringGrid1.Cells[1,i]); //ohne die var's ^^
  end;
du kannst natürlich auch die beiden Variabeln weglassen und die Cells direkt in MoveFile eingeben ... ich find's so nur anschaulicher.
Ist quasi wie dein eigentlicher code nur, daß du MoveFile benutzen musst ..

Hoffe ich habs nun richtig verstanden ^^

PS: Zum zerlegen der Pfadangaben (falls nötig): ExtractFilePath(), ExtractFileName()

danku 11. Mai 2006 16:34

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Zitat:

Zitat von TeronG
:gruebel:
Ich dachte, du möchtest den inhalt des Grid's speichern.
Aber du willst nur die "alte Datei" unter neuem/korigiertem namen speichern oder wie?

irgendwie reden wir aneinander vorbei.
deine 2thesen habe ich bereits schon erledigt.

wenn ich mp3s per topendialog1 ins sgfiles.cells[0,i] lade,
ist es doch logisch die datei wieder zu speichern, die eben in der spalte 1 vorliegen.

ES GEHT MIR DARUM, DAS DIE DATEIEN DIE PER OPENDIALOG IN DIE SPALTE 1 GELADEN WERDEN - DURCH DIE FILTER FORMATIERT WERDEN (NEUE NAMEN VERGEBEN) - UND ZURÜCKGESCHRIEBEN WERDEN. (ALSO UMBENNEN +SPEICHERN)

my try:

Delphi-Quellcode:
procedure Tfmformat.sbsaveClick(Sender: TObject);
var i,sum:integer;

  procedure SaveGrid(grid: TStringGrid; fileName: string);
  var iRow: integer;
  sl: TStringList;
   begin
   sl := TStringList.Create;
   .. ?
     sl.SaveToFile(fileName);
     sl.Free;
      end;

begin

if change= true
  then begin
    Statusbar1.Panels[1].text:='Saved';
    Savedialog1.InitialDir:=GetCurrentDir;

    for i:=0 to Opendialog1.files.count -1 do
    begin
    SaveGrid(sgfiles,opendialog1.Files.Strings[i]);
    end;
end;

marabu 11. Mai 2006 19:25

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Mein letzter Versuch: Wenn deine Original-Dateinamen mit Pfad in Cols[1] stehen und die durch dein Programm korrigierten Namen ohne Pfad in Cols[0], dann sollte das hier funktionieren:

Delphi-Quellcode:
procedure RenameFiles(oldNames, newNames: TStrings; skip: Cardinal = 0);
var
  i: Integer;
  fp, fn: TFileName;
begin
  for i := skip to Pred(oldNames.Count) do
  begin
    fp := ExtracFilePath(oldNames[i]);
    fn := ExtractFileName(oldNames[i]);
    if (i < newNames.Count) and not SameText(fn, newNames[i]) then
    try
      RenameFile(oldNames[i], fp + newNames[i]);
      // positive Rückmeldung
    except
      // negative Rückmeldung
    end;
  end;
end;

procedure TDemoForm.RenameButtonClick(Sender: TObject);
begin
  with StringGrid do
    RenameFiles(Cols[1], Cols[0], FixedRows);
end;
marabu

danku 12. Mai 2006 13:52

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
:thumb: jo
lass dich drücken. danke für deine ausdauer :cheers:
du bist der erste der mein fertiges programm erhält

TeronG 15. Mai 2006 15:33

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
:gruebel:
Ich hatte doch auch alles gepostet? (bis auf die Copy&Paste-Lösung)
ExtractFilePath(), ExtractFileName(), MoveFile() // MoveFile = RenameFile

danku 15. Mai 2006 15:36

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
mag sein. sry wenn ich es übersehn habe.
die move methode ware aufjedenfall nix.
beschäftige mich im moment mit tstringlists

TeronG 15. Mai 2006 15:52

Re: SaveToFile [TStringgrid] ohne Tsavedialog
 
Egal .. hauptsache das Problem wurde trotz der Missverständnisse doch noch gelöst :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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