Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Как очистить строки (s1,s2:string)?   Найти похожие ветки 

 
Катерина   (2005-11-12 19:34) [0]

Имеется произвольный csv-файл, написать программу для отображения содержимого файла в StringGrid.Вроде все работает,считывается правильно.Но если изменить исходный файл в блокноте не выходя из проекта,вернее удалить из него какие-то ячейки,то не работает все остается по-старому.по идее надо строки обнклить s1,s2.или может проблема в другом?Помогите пожалуйста!
вот программа для наглядности:
procedure TForm1.btnOpenClick(Sender: TObject);
var
 f: TextFile;
 S1, S2: string;
 i, j, k: integer;
begin
i := 0;
k := 0;
if (OpenDialog1.Execute) then
Begin
 s1 := " " ;{вот здесь загвоздка!}
 s2 := " " ;{вот здесь загвоздка!}
 StringGrid1.visible:=true;
 AssignFile (f, OpenDialog1.Filename);
 Reset(f);
 while not eof(f) do
 begin
    ReadLn (f, S1);
    Inc(i);
    j := 0;
    while Pos(";" , S1) <> 0 do
     begin
      s2 := Copy(S1,1,Pos(";", S1) -1);
      Inc(j);
      Delete (S1, 1, Pos(";", S1));
      StringGrid1.Cells[j-1, i-1] := S2;
     end;
   if Pos (";", S1) = 0 then
    begin
      Inc(j);
      StringGrid1.Cells[j-1, i-1] := S1;
    end;
  if k < j then k:=j;
   StringGrid1.ColCount := k;
   StringGrid1.RowCount := i;
 end;
end;
CloseFile(f);
end;


 
cvs   (2005-11-12 20:36) [1]

У меня всё работае нормально, вот файл cvs:

100;200;5;7;50;75;150
700;500;300;200;100;100;250
-100;;;;;;
test  55555555555555555555555555555555555555555555555555555555555555                                                             ;;;;;;
ttt;;;;;;
ggggggggggg;;-2;;;;
ddddd;;;;;;
1910;;;;;;
ИСТИНА;;;;;;

;kkk;mmm;;;;
abc;1;2;;;;
ddd;3;4;;;;
;5;;;;;

test  55555555555555555555555555555555555555555555555555555555555555                                                             ;;;;;;;

;ggg;;;;;;
;ddd;;;;;;

587;;;;;;;
;hhh;;;;;;

;;;"""---TEST--""";;;;
объединённые ячейки;;;;;;;
;;;;;;;
;;;;;;;
;;;;;;;
;;;;;;;
;;;;;;;;;;;;
;;;;;;;;;20.03.2003;11.09.2001;555;
;;;;;;;;;;;;
;;;;;;;;;;;;
;;;;;;;;;;;;
;;;;;;;;;;;;


 
Virgo_Style ©   (2005-11-12 20:37) [2]

По-моему, можно сделать немного проще:

StringGrid1.Rows[i].Delimiter:=";";
StringGrid1.Rows[i].DelimitedText:=S;

- и разбиение по колонкам произойдет автоматически.
Надо будет только читать строки и записывать их таким образом...

Попробуйте чистить StringGrid до записи, возможно, там остаются старые значения, хотя по идее - не должны.


 
Virgo_Style ©   (2005-11-12 20:47) [3]

Хм, проверил - после изменения и повторной загрузки все меняется как надо...


 
Катерина   (2005-11-12 20:58) [4]

Надо открыть файл именно в блокноте и,не закрывая проект,изменять и сохранять файл.


 
Virgo_Style ©   (2005-11-12 21:00) [5]

Катерина   (12.11.05 20:58) [4]

Так и делал - запустил, открыл программой, открыл в блокноте, изменил, сохранил, открыл программой.


 
cvs   (2005-11-12 21:08) [6]

>Надо открыть файл именно в блокноте и,не закрывая проект,изменять и
>сохранять файл.

Всё равно работает нормально. Может дело в версии делфи? (У меня D3)

вот текст программы:

procedure TForm1.Button1Click(Sender: TObject);
var
 f: TextFile;
 S1, S2: string;
 i, j, k: integer;
begin

 i := 0;
 k := 0;
 if (OpenDialog1.Execute) then
 begin
   s1 := " ";
   s2 := " ";
   StringGrid1.visible := true;
   AssignFile(f, OpenDialog1.Filename);
   Reset(f);
   while not eof(f) do
   begin
     ReadLn(f, S1);
     Inc(i);
     j := 0;
     while Pos(";", S1) <> 0 do
     begin
       s2 := Copy(S1, 1, Pos(";", S1) - 1);
       Inc(j);
       Delete(S1, 1, Pos(";", S1));
       StringGrid1.Cells[j - 1, i - 1] := S2;
     end;
     if Pos(";", S1) = 0 then
     begin
       Inc(j);
       StringGrid1.Cells[j - 1, i - 1] := S1;
     end;
     if k < j then k := j;
     StringGrid1.ColCount := k;
     StringGrid1.RowCount := i;
   end;
 end;
 CloseFile(f);
end;


 
Катерина   (2005-11-12 21:17) [7]

да ну у меня же правда не работает!а если стереть ячейки так,чтобы в этой строке ячеек осталось меньше,чем в какой-либо другой,то остаток выводится.А как чистить StringGrid до записи?я просто писала s1:="";s2:="";


 
Virgo_Style ©   (2005-11-12 21:37) [8]

А, видимо, я понял, в чем дело. Если было
1;2;3;4;5,
а потом стало
1;2;3;4,
то ячейка с "5" просто не будет очищаться. в общем, вот мое предложение на базе [2]:

function DelimitersCount(S:String;Delimiter:char):integer;
var i:integer;
begin
Result:=0;
for i:=1 to Length(S) do  
 if S[i]=Delimiter then Inc(Result);
end;

procedure TForm1.Button2Click(Sender: TObject);
var S:TStrings;
i, items, maxitems:integer;
const Delimiter=";";
begin
if not OpenDialog1.Execute then exit;
maxitems:=1;
S:=TStringList.Create;
try
 S.LoadFromFile(OpenDialog1.FileName);
 StringGrid1.RowCount:=S.Count;
 for i:=0 to S.Count-1 do
 with StringGrid1 do
 begin
   Items:=DelimitersCount(S[i],Delimiter)+1;
   if maxitems<Items then maxitems:=Items;
   if ColCount<Items then
     ColCount:=Items;
   Rows[i].Delimiter:=Delimiter;
   Rows[i].DelimitedText:=S[i];
 end;
 StringGrid1.ColCount:=MaxItems;
finally
 S.Free;
end;
end;


 
cvs   (2005-11-12 21:56) [9]

добавьте после  
if (OpenDialog1.Execute) then
 begin

    StringGrid1.colcount:=0;
    StringGrid1.rowcount:=0;

Вот теперь работает.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
1-1130922640
alex870
2005-11-02 12:10
2005.11.27
Процедура ReadLn


14-1130772182
myWindow
2005-10-31 18:23
2005.11.27
Соединение компьютеров по технологии шина


14-1131510557
DelphiN!
2005-11-09 07:29
2005.11.27
Отказ от курения, раздражительность


3-1129582275
Павел
2005-10-18 00:51
2005.11.27
синхронизация БД


1-1130960389
John Doe
2005-11-02 22:39
2005.11.27
StringGrid и MouseToCell