Вверх ↑
Этот топик читают: Гость
Администрация
Ответов: 15295
Рейтинг: 1519
#46: 2008-12-28 19:19:40 ЛС | профиль | цитата
Tad, растолкую популярно, если предыдущие сообщения не прояснили суть вопроса: речь сейчас идет не о том, что обсуждалось в топике и не о том, относится к нему Memo или нет, а уж тем более не о том, распознает LoadFromFile представление строк в формате UNIX или нет. Речь сейчас идет о том как, чем и когда заменять последовательности
и
в среде и кодогенераторе.
карма: 27
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#47: 2008-12-28 23:19:51 ЛС | профиль | цитата
Dilma, или я чего-то не догоняю, или почему не сделать вот так:


function ReplaceSChar(const str:string):string;
var i,j,k,w:integer;
t,s:string;
begin
t := ''; i := 1; s := str;

while StrReplace( S, '\n\r', #13#10) do;
while StrReplace( S, '\r\n', #13#10) do;
while i<=Length(s) do begin
if (s[i] = '\')and(i < Length(s)) then begin
inc(i);
if s[i] = '\' then t := t + '\'
else if s[i] = 'n' then t := t + #13
else if s[i] = 'r' then t := t + #10
else if s[i] = 't' then t := t + #9
else if s[i] in ['0'..'9'] then begin
w := 0;
for j := 1 to 3 do begin //ограничение на текстовую длину числа
k := w*10 + ord(s[i]) - ord('0');
if k > 255 then break; //ограничение на величину числа
w := k; inc(i);
if i > Length(s) then break; //правая граница входной строки
if not(s[i] in ['0'..'9']) then break; //значит число кончилось
end;
dec(i); t := t + char(w);
end else t := t + '\' + s[i];
end else t := t + s[i];
inc(i);
end;
Result := StringToCode(t);
end;
В данном случе, одиночные тэги не трогаются. По-хорошему, я бы вообще все перевел на StrReplace
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#48: 2008-12-29 00:06:08 ЛС | профиль | цитата
nesco писал(а):
или почему не сделать вот так:

это работать корректно не будет ровно по той же причине, по которой не работает текущая версия кодогенератора. Любая строка, где есть последовательность

или

будет неверно обработана предложенной выше версией.

Dilma писал(а):
в общем для данного случая невозможно сделать обратную совместимость.


Единственное, что тут в голову приходит это в новой версии среды проверять дату создания всех открываемых схем, и если она меньше, чем дата выхода текущего HiAsm, то заменять все
на и наоборот - на
. Ничего умнее пока не приходит в голову...
карма: 27
0
Ответов: 16884
Рейтинг: 1239
#49: 2008-12-29 00:15:58 ЛС | профиль | цитата
Dilma писал(а):
Речь сейчас идет о том как, чем и когда заменять последовательности \r\n и \n\r в среде и кодогенераторе.
Применить "стандартное" \r\n , а \n\r выбросить и забыть или в CodeGen, при обнаружении такой последовательности заменять её на \r\n.

Вот когда соответствующие наши компоненты будут отображать загружаемые файлы так

то и потребность в последовательности \r\n значительно уменьшится.
------------ Дoбавленo:

и вообще непонятно - почему в этих (наших) компонентах печатаются неотображаемые знаки (|) ?
Картинка приведенная выше сделана в Delphi

procedure TForm1.Button1Click(Sender: TObject);
const f='c:\elements.sql';
begin
Memo1.Lines.LoadFromFile(f);
ListBox1.Items.LoadFromFile(f);
CheckListBox1.Items.LoadFromFile(f);
RichEdit1.Lines.LoadFromFile(f);
end;
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1delstr.gif [27.4KB] [397]
Разработчик
Ответов: 26170
Рейтинг: 2127
#50: 2008-12-29 00:31:13 ЛС | профиль | цитата
Dilma писал(а):
Любая строка, где есть последовательность

или

будет неверно обработана предложенной выше версией

Это почему же Такая последовательность должна выдать #13#10#13#10. В данном случае, применяется KOL функция, которая находит только первое вхождение искомой последовательности, для следующей последовательности, это будет уже следующее вхождение. Там же стоит while, он обработает все встреченные последовательности.

------------ Дoбавленo:


Dilma, проверь на примере Tada, все прекрасно работает, или вот на этом



Add(MainForm,2953706,231,175)
{
}
Add(ListBox,7564829,469,231)
{
Top=125
Width=710
Height=85
}
Add(Button,12100919,231,245)
{
Left=5
Top=225
link(onClick,2797692:doExecute,[])
}
Add(Replace,7691214,378,252)
{
SubStr=""
DestStr="

"
link(onReplace,7564829:doText,[])
link(Str,2660603:Text,[])
}
Add(Hub,6867652,329,245)
{
link(onEvent1,2660603:doLoad,[(369,251)(369,195)])
link(onEvent2,7691214:doReplace,[])
}
Add(Memo,2660603,378,161)
{
Left=5
Top=5
Width=705
ScrollBars=2
}
Add(ODialog,2797692,280,245)
{
link(onExecute,6867652:doEvent1,[])
}

------------ Дoбавленo:

Tad писал(а):
или в CodeGen, при обнаружении такой последовательности заменять её на
.

А я что предложил
------------ Дoбавленo:

Народ, вы мое предложение проверяли, или на пальцах пытаетесь доказать, что это не то, что нужно
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#51: 2008-12-29 00:34:03 ЛС | профиль | цитата
Tad, я за годы нашего совместного творчества до сих пор не перестаю удивлятся тому, как можно так виртуозно одну и туже проблему мурыжить со всех возможных сторон привлекая хоть и верные, но совершенно бесполезные аргументы.

nesco писал(а):
Это почему же Такая последовательность должна выдать #13#10#13#10.

ну как же это она интресно при \r\n\r\n выдаст #13#10#13#10?

#pas
t := '';
i := 1;
s := str; // имеем в s строку 'hello\r\n\r\nword'

while StrReplace( S, '\n\r', #13#10) do; // после первой же итерации имеем 'hello\r'#13#10'\nword'
while StrReplace( S, '\r\n', #13#10) do; // а тут уже ничего не изменится, потому что заменять больше нечего
разве не так?

------------ Дoбавленo:

nesco писал(а):
или на пальцах пытаетесь доказать, что это не то, что нужно

именно
карма: 27
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#52: 2008-12-29 00:59:10 ЛС | профиль | цитата
Dilma писал(а):
разве не так?

Да, действительно. Надо подумать, может это удасться обойти. Ну не верю я в невозможность решения этой проблемы

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#53: 2008-12-29 01:04:54 ЛС | профиль | цитата
Dilma писал(а):
Единственное, что тут в голову приходит это в новой версии среды проверять дату создания всех открываемых схем, и если она меньше, чем дата выхода текущего HiAsm, то заменять все
на и наоборот - на
. Ничего умнее пока не приходит в голову...
тоже выход.
Или создать отдельную програмку обработки sha-файлов, созданых до 2009 года
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Астрамак
Ответов: 3514
Рейтинг: 184
#54: 2008-12-29 01:13:21 ЛС | профиль | цитата
и прогнать все экзамплы, а потом саму сделать экзамплом..
+1, tad
карма: 0
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#55: 2008-12-29 01:46:04 ЛС | профиль | цитата
Кажется, я нашел решение.


  while StrReplace( S, '\n\r\n\r', #13#10#13#10) do;
while StrReplace( S, '\r\n\r\n', #13#10#13#10) do;
while StrReplace( S, '\n\r\r\n', #13#10#13#10) do;
while StrReplace( S, '\r\n\n\r', #13#10#13#10) do;
while StrReplace( S, '\n\r', #13#10) do;
while StrReplace( S, '\r\n', #13#10) do;
------------ Дoбавленo:

Кто-нибудь может предложить сочетания, на котором предложенный код нормально не отработает.
карма: 22

0
Ответов: 5227
Рейтинг: 587
#56: 2008-12-29 08:45:17 ЛС | профиль | цитата
а если эту возможность на себя возмёт сама среда, предположим на этапе загрузки схемы, хотя впрочем и буфер обмена должен отслеживаться наверно.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#57: 2008-12-29 10:10:57 ЛС | профиль | цитата
Скорее всего, это тоже возможно, но алгоритмы преобразования одной последовательности в другую будут похожи
------------ Дoбавленo:

Tad, почему бы тебе не проверить вот эту конверсию одного в другое


function ReplaceSChar(const str:string):string;
var i,j,k,w:integer;
t,s:string;
begin
t := ''; i := 1;s := str;
while StrReplace( S, '\n\r\n\r', #13#10#13#10) do;
while StrReplace( S, '\r\n\r\n', #13#10#13#10) do;
while StrReplace( S, '\n\r\r\n', #13#10#13#10) do;
while StrReplace( S, '\r\n\n\r', #13#10#13#10) do;
while StrReplace( S, '\n\r', #13#10) do;
while StrReplace( S, '\r\n', #13#10) do;
while i<=Length(s) do begin
if (s[i] = '\')and(i < Length(s)) then begin
inc(i);
if s[i] = '\' then t := t + '\'
else if s[i] = 'n' then t := t + #10
else if s[i] = 'r' then t := t + #13
else if s[i] = 't' then t := t + #9
else if s[i] in ['0'..'9'] then begin
w := 0;
for j := 1 to 3 do begin //ограничение на текстовую длину числа
k := w*10 + ord(s[i]) - ord('0');
if k > 255 then break; //ограничение на величину числа
w := k; inc(i);
if i > Length(s) then break; //правая граница входной строки
if not(s[i] in ['0'..'9']) then break; //значит число кончилось
end;
dec(i); t := t + char(w);
end else t := t + '\' + s[i];
end else t := t + s[i];
inc(i);
end;
Result := StringToCode(t);
end;

Dilma, может это и есть выход из положения Надо бы проверить...
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#58: 2008-12-29 11:34:51 ЛС | профиль | цитата
andrestudio писал(а):
если эту возможность на себя возмёт сама среда, предположим на этапе загрузки схемы,
то в CodeGen предложенное nesco уже будет совершенно лишним.
Весь сыр-бор из-за совместимости с утильсырьем
Нужны эти потуги или нет - решать Dilma.

------------ Дoбавленo:

nesco писал(а):
почему бы тебе не проверить
должно работать
------------ Дoбавленo:

nesco, отвлекись и послушай арабскую песню http://www.youtube.com/watch?v=37SodCJn9Co
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#59: 2008-12-29 11:37:32 ЛС | профиль | цитата
Tad, ну ты и приколист
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#60: 2008-12-29 11:39:32 ЛС | профиль | цитата
А я тут при чем - так звучит детская арабская песня в русском ухе.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)