|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Если файл в который вы сохраняете сдержимое StringGrida непредполагается модифицировать, то тогда можно просто загнать все содержимое StringGrida в поток и сохранить, после чего прочитать что взяли тем-же макаром.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#17
|
||||
|
||||
Страдалецъ, мб, это уже оффтоп, но мне тут для одной МОЕЙ проги нужна база, которую нельзя будет вскрыть другой программой... Хочется узнать про реализацию твоего (поточного) метода, ибо сам я не разберусь (с потоками слабо дружу).
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#18
|
||||
|
||||
Спасибо огромное человеческое)
...а насчет потока... вот так сохранял: Цитата:
а вот так читал: Цитата:
сохраняло нормально, а вот возвращает только пустую таблицу со всеми ее параметрами... но только пустую... я программированием только 2 недели занимаюсь, и в чем проблема не знаю |
#19
|
||||
|
||||
Насколько я в курсе метод WriteComponent сохранит данные без динамических элементов, что для вас неподходит. Я набросал для вас вариант который сохраняет содержимое ячеек грида.
Код:
unit Unit12; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ExtCtrls, ComCtrls; type TForm12 = class(TForm) StringGrid1: TStringGrid; Panel1: TPanel; btnGenerate: TButton; btnSave: TButton; btnLoad: TButton; RowsUpDown: TUpDown; edRows: TEdit; Label1: TLabel; edCols: TEdit; ColsUpDown: TUpDown; Label2: TLabel; Panel2: TPanel; SaveDialog: TSaveDialog; OpenDialog: TOpenDialog; btnClear: TButton; procedure FormCreate(Sender: TObject); procedure edRowsChange(Sender: TObject); procedure edColsChange(Sender: TObject); procedure btnGenerateClick(Sender: TObject); procedure btnSaveClick(Sender: TObject); procedure btnLoadClick(Sender: TObject); procedure btnClearClick(Sender: TObject); private procedure UpdateSheet; procedure RandomFillGrid; public { Public declarations } end; var Form12: TForm12; implementation {$R *.dfm} procedure TForm12.UpdateSheet; Var C,R: Integer; begin for C := 1 to ColsUpDown.Position do StringGrid1.Cells[C,0] := Chr(64+C); for R := 1 to RowsUpDown.Position do StringGrid1.Cells[0,R] := IntToStr(R); end; procedure TForm12.RandomFillGrid; Var C,R: Integer; begin for R := 1 to RowsUpDown.Position do for C := 1 to ColsUpDown.Position do StringGrid1.Cells[C,R] := IntToStr(Random(100000)); end; procedure TForm12.btnClearClick(Sender: TObject); Var C,R: Integer; begin for R := 1 to RowsUpDown.Position do for C := 1 to ColsUpDown.Position do StringGrid1.Cells[C,R] := ''; end; procedure TForm12.btnGenerateClick(Sender: TObject); begin RandomFillGrid; end; procedure TForm12.btnLoadClick(Sender: TObject); Var F: TFileStream; Col,Row,Cols,Rows: Word; Len: Byte; Data: ShortString; begin if not OpenDialog.Execute then Exit; F := TFileStream.Create(OpenDialog.FileName,fmOpenRead); F.ReadBuffer(Cols,SizeOf(Word)); F.ReadBuffer(Rows,SizeOf(Word)); ColsUpDown.Position := Cols; RowsUpDown.Position := Rows; UpdateSheet; for Row := 1 to Rows do for Col := 1 to Cols do begin F.ReadBuffer(Len,SizeOf(Byte)); SetLength(Data,Len); F.ReadBuffer(Data[1],Len); StringGrid1.Cells[Col,Row] := Data; end; F.Free; end; procedure TForm12.btnSaveClick(Sender: TObject); Var F: TFileStream; Col,Row,Cols,Rows: Word; Len: Byte; Data: ShortString; begin if not SaveDialog.Execute then Exit; F := TFileStream.Create(SaveDialog.FileName,fmCreate); Cols := ColsUpDown.Position; Rows := RowsUpDown.Position; F.WriteBuffer(Cols,SizeOf(Word)); F.WriteBuffer(Rows,SizeOf(Word)); for Row := 1 to Rows do for Col := 1 to Cols do begin Data := StringGrid1.Cells[Col,Row]; F.WriteBuffer(Data,Length(Data)+1); end; F.Free; end; procedure TForm12.edColsChange(Sender: TObject); begin StringGrid1.ColCount := ColsUpDown.Position+1; UpdateSheet; end; procedure TForm12.edRowsChange(Sender: TObject); begin StringGrid1.RowCount := RowsUpDown.Position+1; UpdateSheet; end; procedure TForm12.FormCreate(Sender: TObject); begin UpdateSheet; end; end. Код:
object Form12: TForm12 Left = 0 Top = 0 Caption = 'Form12' ClientHeight = 302 ClientWidth = 635 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object StringGrid1: TStringGrid Left = 0 Top = 0 Width = 547 Height = 302 Align = alClient TabOrder = 0 ExplicitWidth = 561 end object Panel1: TPanel Left = 547 Top = 0 Width = 88 Height = 302 Align = alRight TabOrder = 1 ExplicitLeft = 548 object Label1: TLabel Left = 6 Top = 10 Width = 30 Height = 13 Caption = 'Rows:' end object Label2: TLabel Left = 6 Top = 33 Width = 24 Height = 13 Caption = 'Cols:' end object btnGenerate: TButton Left = 6 Top = 56 Width = 75 Height = 25 Caption = 'Generate' TabOrder = 0 OnClick = btnGenerateClick end object btnSave: TButton Left = 6 Top = 139 Width = 75 Height = 25 Caption = 'Save' TabOrder = 1 OnClick = btnSaveClick end object btnLoad: TButton Left = 6 Top = 170 Width = 75 Height = 25 Caption = 'Load' TabOrder = 2 OnClick = btnLoadClick end object RowsUpDown: TUpDown Left = 65 Top = 7 Width = 16 Height = 20 Associate = edRows Min = 1 Position = 2 TabOrder = 3 end object edRows: TEdit Left = 40 Top = 7 Width = 25 Height = 20 ReadOnly = True TabOrder = 4 Text = '2' OnChange = edRowsChange end object edCols: TEdit Left = 40 Top = 30 Width = 25 Height = 20 ReadOnly = True TabOrder = 5 Text = '2' OnChange = edColsChange end object ColsUpDown: TUpDown Left = 65 Top = 30 Width = 16 Height = 20 Associate = edCols Min = 1 Position = 2 TabOrder = 6 end object Panel2: TPanel Left = 2 Top = 119 Width = 83 Height = 1 TabOrder = 7 end object btnClear: TButton Left = 6 Top = 88 Width = 75 Height = 25 Caption = 'Clear' TabOrder = 8 OnClick = btnClearClick end end object SaveDialog: TSaveDialog DefaultExt = '*.sdf' Filter = 'Stream data file (*.sdf)|*.sdf|All files (*.*)|*.*' Left = 560 Top = 208 end object OpenDialog: TOpenDialog DefaultExt = '*.sdf' Filter = 'Stream data file (*.sdf)|*.sdf|All files (*.*)|*.*' Left = 592 Top = 208 end end Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#20
|
|||
|
|||
Цитата:
|
#21
|
|||
|
|||
NewWorld, вы имели в виду: поставить в качестве символа-разделителя табуляцию вместо запятой??? =)
Дело в том, что свойство CommaText в некотором смысле производное от "более общего" свойства — DelimitedText, который может использовать любой символ в качестве разделителя. Код:
procedure TForm1.BitBtn1Click(Sender: TObject); var i, LastRow: Integer; SList: TStringList; begin SList := TStringList.Create; LastRow := StringGrid1.RowCount - 1; try for i := 0 to LastRow do begin StringGrid1.Rows[i].Delimiter := #9; SList.Add(StringGrid1.Rows[i].DelimitedText); end; SList.SaveToFile('C:\Directory\File.tsv'); finally SList.Free; end; end; |
#22
|
|||
|
|||
у меня тут StringGrid1.Rows[i].Delimiter := #9;
Delimiter не определяется.. я работаю на Delphi5 может в этом причина? если да то как можно обойти ее ?? |
#23
|
|||
|
|||
Действительно, в пятой Delphi не пройдет. Но что за проблема — напишите свой аналог...
Код:
function TForm1.GetDelimitedText(const StringGridRow: TStrings; _Delimiter: Char): string; var i: Integer; begin Result := StringGridRow.Strings[0]; for i := 1 to StringGridRow.Count - 1 do Result := Result + _Delimiter + StringGridRow.Strings[i]; end; procedure TForm1.Button3Click(Sender: TObject); var i, LastRow: Integer; SList: TStringList; begin SList := TStringList.Create; LastRow := StringGrid1.RowCount - 1; try for i := 0 to LastRow do SList.Add(GetDelimitedText(StringGrid1.Rows[i], #9)); SList.SaveToFile('C:\Directory\File.tsv'); finally SList.Free; end; end; |
#24
|
|||
|
|||
спасибо огромное ПОЛУЧИЛОСЬ!!!!!!!
|