![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с CommaText [D7, WinXP]
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]Все-таки нужен код. Подробный. Иначе игра в "холодно-горячо" получается какая-то.