Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Обработка StringGrid (http://forum.oszone.net/showthread.php?t=129040)

noname_06 18-01-2009 17:42 1011592

Обработка StringGrid
 
В TMemo из файла загружен список файлов в виде [Линк |размер дата время]. Нужно чтобы в StringGrid в первом столбце были обработаные адреса файлов, а в втором - размер. Пробовал так:

Код:

procedure TForm1.RunBtnClick(Sender: TObject); {обработка файла}
var i, j, position, strlenght, x, y, w, MaxWidth: integer;
    currstr, s: string;
begin
  StringGrid.Visible:= true;
  for j:=1 to 2 do {заполняется первый столбец, потом второй}
    begin
    for i:=1 to StringGrid.RowCount+1 do
    begin
    currstr:= Memo.Lines[i-1]; {получаем текущую строку}
    strlenght:= length(currstr); {длина}
    position:= pos(' |', currstr); {позиция конца адреса в строке}
      if j=1 then {для первого столбца оставляем только линк}
      begin
      delete(currstr, position, strlenght-position+1);
      currstr:= concat(EditPatch.text, currstr);
      end
      else {для второго солбца оставляем только размер файла}
      begin
      delete(currstr, 1, position+1);
      position:= pos(' ', currstr);
      delete(currstr, position, strlenght-position+1);
      currstr:= IntToStr(StrToInt(currstr) div 1024 div 1024) + 'Mb';
      end;
    StringGrid.Cells[j,i]:= currstr; {заполняем ячейку}
      if j=1 then ProgressBar.Position := 100 * i div StringGrid.RowCount
      else ProgressBar.Position := 50 + 100 * i div StringGrid.RowCount
    end;
  end;
  with StringGrid do {установить ширину ячеек по макс. ширине текста}
    ClientHeight:= DefaultRowHeight * RowCount + 5;
    with StringGrid do
    begin
      for x := 0 to ColCount - 1 do
      begin
        MaxWidth := 0;
        for y := 0 to RowCount - 1 do
        begin
          w := Canvas.TextWidth(Cells[x,y]);
          if w > MaxWidth then
            MaxWidth := w;
        end;
        ColWidths[x] := MaxWidth + 5;
      end;
    end; {конец установки}
end;

При нажатии на кнопку выбрасывает ошибку:
Debugger Exeption Notificetion
Project ***** raised exeprion class EConvertError with message "is not a valid integer value"

з.ы. и ещё - как лучше напрямую прочитать/записать данные в StringGrid из текстового файла? (подразумевается обработка по 5-30 тыс. строк текста)
з.з.ы. как правильно прикрутить к проэкту XPManifest? простым добавлением на форму не хочет. Среда Delphi 7.0

Alan85 18-01-2009 22:29 1011971

Цитата:

Цитата noname_06
StrToInt(currstr) »

ошибка может быть только тут, но я у себя скомпилил все в порядке , значит ошибка раньше - возможно в memo или в файле с данными

detrin 19-01-2009 01:44 1012150

Цитата:

Цитата Alan85
как правильно прикрутить к проэкту XPManifest? простым добавлением на форму не хочет. Среда Delphi 7.0 »

В uses добавьте XPMan.

noname_06 19-01-2009 01:46 1012152

Таки да, компилятору не понравилось именно это, точнее не сам перевод строки в integer, а почему-то попытка использовать его как аргумент для div. Пробовал отдельно StrToInt присвоить real-переменой, потом значение real-а передать integer переменной и уже из неё вычислять размер в Мб - всё равно не хочет :(

Цитата:

В uses добавьте XPMan.
-уже присутствует :(

Alan85 19-01-2009 07:49 1012240

Так ведь же у меня (думаю и других тоже) прошло на тесте.
Цитата:

Цитата noname_06
is not a valid integer value »

Похоже что где то у тебя вместо числа передается чисто с лишним пробелом или символом. Попробуй пошагово отдебагить с выводом сообщений что где чему равно и на чем спотыкается.

noname_06 19-01-2009 16:39 1012785

Не знаю что это было, но переписал как

Код:

size: integer;

size:= StrToInt(currstr) div 1048576;
StringGrid.Cells[j,i]:= IntToStr(size) + ' Mb';

и всё прошло, на том же самом файле


Время: 14:08.

Время: 14:08.
© OSzone.net 2001-