Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с CommaText [D7, WinXP]


Страницы:   1 2

cvg ©   (2004-07-08 17:53:00) 

Hi All! Помогите чайнику кто чем сможет!

В одном месте проги у меня строчка

list.CommaText := line;

работает без проблем, в другом -- ругается словами Access Violation. Причем происходит это на стороке

if (FDelimiter <> Value) or not (sdDelimiter in FDefined) then

в процедере

procedure TStrings.SetDelimiter(const Value: Char);

В чем может быть трабл?


Думкин   (2004-07-09 10:18:00) [1]


> [26] cvg   (09.07.04 09:58)

Ты бы книжку какую почитал, что ли?


cvg   (2004-07-09 09:58:00) [2]

list.Free? Ладно, где-нить воткну... А то память не освободится, что ли?


cvg   (2004-07-09 09:56:00) [3]

Да вроде как я в последнем варианте написал, так работает -- например, list[19] оказался равным "227,10" (без кавычек, конечно). Что, собственно, я и хотел получить. Вот.


КаПиБаРа   (2004-07-09 09:56:00) [4]


> cvg

Там еще где то надо вставить list.Free :)


ЮЮ   (2004-07-09 09:52:00) [5]

Хотя, помнится, этот побочный эффект вылазил, если определенного тобой разделителя не было в строке. Т.е. достатосно так:
if Pos(list.Delimiter , s) > 0 then
 list.DelimitedText := s
else
 list.Text := s;


ЮЮ   (2004-07-09 09:45:00) [6]

К сожалению, IMHO, list.Delimiter := ' ' доопределяет, а не переопределяет разделители, и десятичная запятая так и останется в числе разделителей. Поэтому надежнее самому парсить текст и выделять "единицы" информации


cvg   (2004-07-09 09:29:00) [7]

Ой, там вроде так должно быть:

  list := Tstringlist.create;
  list.Delimiter := ' ';


cvg   (2004-07-09 09:21:00) [8]

ПРОКАТИЛО!!! Всем спасибо! Только еще ма-аланький вопросец:

В принципе CommaText -- это чисто временное решение. Вместо него хотелось бы использовать DelimitedText (потому что в выдираемом тексте есть числа с десятичными запятыми). Теперь, чтобы мне переопределить Delimiter, я в var должен написать Delimiter:Char;, а в теле проседуры -- Delimiter := ' ';. Правильно?


ЮЮ   (2004-07-09 09:07:00) [9]

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

если же Data_from_KKK - внешняя и вызывается из разных процедур и им этот list ьоже нужен, то надо добавить list в параметры и не забыть создать для вызова.

если же list нужен только в Data_from_KKK, то см. [15]


cvg   (2004-07-09 09:02:00) [10]

Точно, перед вторым вызовом (который без ошиюок проходит) есть такая! Типа, и перед первым должна быть? Ща попробую...


Anatoly Podgoretsky   (2004-07-09 08:54:00) [11]

Где ни будь возможно и есть, а что?


КаПиБаРа   (2004-07-09 08:52:00) [12]


> ЮЮ ©

Вторым случаем может быть вложенная процедура.


ЮЮ   (2004-07-09 08:52:00) [13]

а строчка list := TStringList.Create  в вызывающей процедуре есть?


Alx2   (2004-07-09 08:52:00) [14]


procedure Data_from_KKK (Geld,Geld_locked:double;lots,lots_locked:integer);
var i1,i2:integer;
List : TStringList;
begin
 windows.BringWindowToTop(h_mons);
 PressKeys('Ctrl+C',10);
 try
  line := Clipboard.AsText;
 except
  raise Exception.Create('blah-blah-blah');
 end;
 List := TStringList.Create;
try
 list.CommaText := line;
// Разбор....
finally
List.Free;
end;


КаПиБаРа   (2004-07-09 08:51:00) [15]

У тебя в коде есть строка list := TStringList.Create; ?


ЮЮ   (2004-07-09 08:51:00) [16]

да и во втором, похоже, создан случайно


cvg   (2004-07-09 08:50:00) [17]

Но он же определен в вызывающей процедуре! И потом, я ведь уже пробовал дописывать в var

var ... list:TStringList; line:string;

-- не помогло Ж:((


КаПиБаРа   (2004-07-09 08:47:00) [18]

В первом случае list не создан


cvg   (2004-07-09 08:44:00) [19]

Вот тут выдает ошибку:

procedure Data_from_KKK (Geld,Geld_locked:double;lots,lots_locked:integer);
var i1,i2:integer;
begin
  windows.BringWindowToTop(h_mons);
  PressKeys('Ctrl+C',10);
  try
   line := Clipboard.AsText;
  except
   raise Exception.Create('blah-blah-blah');
  end;
  list.CommaText := line;
// Разбор значений

А вот тут все нормально:

function file_reading:Boolean;
var buf:array [1..2] of double;
begin
 if eof(FL)
 then Result := false
 else
  begin
   buf[1] := ar[4]; ar[4] := ar[1];
   buf[2] := ar[5]; ar[5] := ar[2];
   Readln(FL,line);
   Application.ProcessMessages;
   list.CommaText := line;
// Разбор значений
   Result := true;


Alx2   (2004-07-09 08:24:00) [20]

Все-таки нужен код. Подробный. Иначе игра в "холодно-горячо" получается какая-то.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо