Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизПроблема с CommaText Найти похожие ветки
← →
cvg (2004-07-08 17:53) [0]Hi All! Помогите чайнику кто чем сможет!
В одном месте проги у меня строчка
list.CommaText := line;
работает без проблем, в другом -- ругается словами Access Violation. Причем происходит это на стороке
if (FDelimiter <> Value) or not (sdDelimiter in FDefined) then
в процедере
procedure TStrings.SetDelimiter(const Value: Char);
В чем может быть трабл?
← →
ssk © (2004-07-08 17:55) [1]по коду похоже, что тебе в конференцию "Компоненты" надо идти
← →
Семен Сорокин © (2004-07-08 17:58) [2]ты бы весь код привел? интересуют строки до
list.CommaText := line;
← →
cvg (2004-07-08 18:19) [3]Там, где ругается, предшествующий код такой:
try
line := Clipboard.AsText;
except
raise Exception.Create("blah-blah-blah");
end;
list.CommaText := line;
а там, где не ругается, такой:
Readln(FL,line);
Application.ProcessMessages;
list.CommaText := line;
← →
cvg (2004-07-09 07:23) [4]Люди! Pls не молчите! подскажите че-нить! Ибо сильно нужно... :/
← →
Alx2 © (2004-07-09 08:15) [5]>cvg (09.07.04 07:23) [4]
list - что это? Как он создается и что с ним происходит "до того"?
← →
cvg (2004-07-09 08:21) [6]list описан в вызывающей процедуре как list:TStringList.
← →
Думкин © (2004-07-09 08:22) [7]
> [6] cvg (09.07.04 08:21)
А он создан? Как он живет и т.п.
← →
Alx2 © (2004-07-09 08:24) [8]Все-таки нужен код. Подробный. Иначе игра в "холодно-горячо" получается какая-то.
← →
cvg (2004-07-09 08:44) [9]Вот тут выдает ошибку:
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;
← →
КаПиБаРа © (2004-07-09 08:47) [10]В первом случае list не создан
← →
cvg (2004-07-09 08:50) [11]Но он же определен в вызывающей процедуре! И потом, я ведь уже пробовал дописывать в var
var ... list:TStringList; line:string;
-- не помогло Ж:((
← →
ЮЮ © (2004-07-09 08:51) [12]да и во втором, похоже, создан случайно
← →
КаПиБаРа © (2004-07-09 08:51) [13]У тебя в коде есть строка list := TStringList.Create; ?
← →
КаПиБаРа © (2004-07-09 08:52) [14]
> ЮЮ ©
Вторым случаем может быть вложенная процедура.
← →
Alx2 © (2004-07-09 08:52) [15]
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:52) [16]а строчка list := TStringList.Create в вызывающей процедуре есть?
← →
Anatoly Podgoretsky © (2004-07-09 08:54) [17]Где ни будь возможно и есть, а что?
← →
cvg (2004-07-09 09:02) [18]Точно, перед вторым вызовом (который без ошиюок проходит) есть такая! Типа, и перед первым должна быть? Ща попробую...
← →
ЮЮ © (2004-07-09 09:07) [19]если Data_from_KKK - вложенная в ту самую вызывающую, то наличие, причем до вызова Data_from_KKK, ну просто необходимо.
если же Data_from_KKK - внешняя и вызывается из разных процедур и им этот list ьоже нужен, то надо добавить list в параметры и не забыть создать для вызова.
если же list нужен только в Data_from_KKK, то см. [15]
← →
cvg (2004-07-09 09:21) [20]ПРОКАТИЛО!!! Всем спасибо! Только еще ма-аланький вопросец:
В принципе CommaText -- это чисто временное решение. Вместо него хотелось бы использовать DelimitedText (потому что в выдираемом тексте есть числа с десятичными запятыми). Теперь, чтобы мне переопределить Delimiter, я в var должен написать Delimiter:Char;, а в теле проседуры -- Delimiter := " ";. Правильно?
← →
cvg (2004-07-09 09:29) [21]Ой, там вроде так должно быть:
list := Tstringlist.create;
list.Delimiter := " ";
← →
ЮЮ © (2004-07-09 09:45) [22]К сожалению, IMHO, list.Delimiter := " " доопределяет, а не переопределяет разделители, и десятичная запятая так и останется в числе разделителей. Поэтому надежнее самому парсить текст и выделять "единицы" информации
← →
ЮЮ © (2004-07-09 09:52) [23]Хотя, помнится, этот побочный эффект вылазил, если определенного тобой разделителя не было в строке. Т.е. достатосно так:
if Pos(list.Delimiter , s) > 0 then
list.DelimitedText := s
else
list.Text := s;
← →
КаПиБаРа © (2004-07-09 09:56) [24]
> cvg
Там еще где то надо вставить list.Free :)
← →
cvg (2004-07-09 09:56) [25]Да вроде как я в последнем варианте написал, так работает -- например, list[19] оказался равным "227,10" (без кавычек, конечно). Что, собственно, я и хотел получить. Вот.
← →
cvg (2004-07-09 09:58) [26]list.Free? Ладно, где-нить воткну... А то память не освободится, что ли?
← →
Думкин © (2004-07-09 10:18) [27]
> [26] cvg (09.07.04 09:58)
Ты бы книжку какую почитал, что ли?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.039 c