![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
строки.... [D7, XP]
Steep © (2008-02-11 23:06:00)суть такая берем первый Memo (текст примерно такой):
Linkin Park, Era, Ария, Evanescence, Limp Bizkit, DMX, 50 Cent, Slipknot, Nightwish,
Rammstein, Enya, Papa Roach, Король и Шут, Blink 182, Apocaliptica, Benny Benassi,
Alizee, Nickelback, Nirvana, Powerman 5000, The Black Eyed Peace, Наив,
Cranberries, Moby, Ludacris, Tokia Hotel, Three Days Grace, Nelly Furtado, Metallica,
HIM, Prodigy, Brainstorm, Tiga, KoRn, Green Day, 666, Город 312, Roxette, Jay-Z, Rob
Zombie, Flipsyde, Justin Timberlake, Сплин, Дельфин, Timbaland, placebo, zdob si
zdub, Paul Van Dyk, all american rejects, Guano Apes, Lordi, Lost prophets, Rihanna,
Global Deejays, Die Apokalyptischen Reiter, Пилигрим, Легалайз, Morcheeba, Akon,
Pink, Bob Sinkler, Gregorian, The Killers, Fort Minor
потом ищем до запятой копируем в Memo2 вроде бы все работает
НО почемуто после некоторых названии в Memo2 появляются пустые строки...
например после: Nightwish, Benny Benassi, Наив, Metallica и тд.
код сканирование текста
procedure TForm1.Button1Click(Sender: TObject);
var
AllText: string;
x: boolean;
tmp: string;
tmppos: integer;
begin
x := false;
AllText := Memo1.Text;
repeat
tmppos := pos(', ', AllText);
if tmppos<>0 then
begin
//Showmessage(AllText);
tmp := copy(AllText, 1, tmppos-1 );
//Showmessage('tmp: ' + tmp);
Memo2.Lines.Append( tmp );
delete(AllText, 1, tmppos+1 );
//Showmessage(AllText);
end
else x := true;
until x
end;
как недопустить их появления? в чем может быть ошибка?
Johnmen (2008-02-12 00:27:00) [41]Зачем использовать аффигенно тормознутые ф-ии, если можно написать быстрый однопроходный код?
Типа этого:
const
delim = ',';
ignorechars : set of char =[ #13,#10,#32];
s:=Memo.Text;
len:=Length(s);
ibeg:=1; i:=ibeg;
while i<=len do begin;
while (ibeg<=len) and ((s[ibeg] in ignorechars) or (s[ibeg]=delim)) do Inc(ibeg);
i:=ibeg;
while (i<=len) and (s[i]<>',') do Inc(i);
iend:=i-1;
while (iend>1) and (s[iend] in ignorechars) do Dec(iend);
Memo.Lines.Add(Copy(s,ibeg,iend-ibeg+1));
Inc(i);
ibeg:=i;
end;
Игорь Шевченко (2008-02-12 00:26:00) [42]
> теперь зародилась несколько другая проблема... при копировании,
> а затем вставки вместо русского текста нечитаемый набор
> символов...
Клавиатуру на русский переключи перед копированием :)
Steep (2008-02-12 00:21:00) [43]теперь зародилась несколько другая проблема... при копировании, а затем вставки вместо русского текста нечитаемый набор символов...
нужно исползовать юникод? или можно както скопировать нормально?
Steep (2008-02-12 00:11:00) [44]
> Может подойдет? :)
ээээ.... что-то я понимаю что чем мудренее проблема тем решенее лучше если оно проще.....
ketmar (2008-02-12 00:04:00) [45]интересно, почему никто не вспомнил про TStrings.CommaText?
---
Understanding is not required. Only obedience.
Steep (2008-02-12 00:04:00) [46]
> Игорь Шевченко ©
спасибо - хоть что то я начинаю понимать....
ketmar (2008-02-12 00:03:00) [47]>[17] antonn © (2008-02-11 23:59:00)
бить палкой тех идиотов, которые делают разделение строк как #10#13. эти символы пользователь точно не вводит руками. это только кривая софтина может такое родить. автора такой софтины кастрировать, и вывесить на фонарь — для вразумления остальных.
---
Understanding is not required. Only obedience.
{RASkov} (2008-02-12 00:02:00) [48]> Steep
Кстати попробуй еще вот такой вариант:
procedure TForm1.Button2Click(Sender: TObject);
var AllText: string;
begin
AllText := StringReplace(Memo1.Text, #13#10, '', [rfReplaceAll]);
Memo2.Lines.Text := StringReplace(AllText, ', ', #13#10, [rfReplaceAll]);
end;
Может подойдет? :)
antonn (2008-02-11 23:59:00) [49]
> Anatoly Podgoretsky © (11.02.08 23:43) [13]
>
> > antonn (11.02.2008 23:38:11) [11]
>
> Таких бить палкой
>
нет, бить палкой тех программеров, которые не учли вольный ввод пользователя. Не имхо. Для мемо по-барабану как идет перенос строки и перевод каретки.
Steep (2008-02-11 23:58:00) [50]
> Это домашнее задание автору.
задание вроде понял =)
еще понял что все таки мы в процедуре сразу ищем ', ' и кидаем слова в список который потом отдаем во второе мемо
> мне сейчас лень проверять, а что будет если не #13#10, а
> #10#13? :)
вроде после #13 (вроде ентер ) может идти #10 (символ каретки вроде как), а наоборот я не уверен
> Anatoly Podgoretsky ©
зачем так жестко?
> Это разделитель вообще-то)
угу понял...
> > теперь я чувствую полный ламмером......
> ты прав :(
>:)
>Ничего нового Игорь не написал, все есть в F1 т.е. - хэлпе...
угу я думаю я хоть что начал понимать в итоге чувствую что все что я знаю это ничто по сравнению с тем что есть.... чето как то и желание программировать отпадать начинает....
Насчет F1 есть... токо как узнать есть ли команды типа StringReplace(Memo1.Text, #13#10, '', [rfReplaceAll]);
с которыми бьешся бьешся а в итоге оказывается что это было....
я понимаю по справке можно посмотреть у известной команды параметры - и если не обчень понятно пример.... а как узнать что там вобще есть.....
Игорь Шевченко (2008-02-11 23:45:00) [51]Steep (11.02.08 23:41) [12]
> Source исходная строка
> Delimeter то что удаляем
> Parts -это то что возвращаем?
{
Преобразование строки с разделителями в список строк.
Параметры:
Source - исходная строка.
Delimiter - строка-разделитель.
Parts - список строк, заполняемый функцией. Создается и уничтожается
вызывающей функцией.
}
Parts.BeginUpdate - в случае, как предложил {RASkov} © это вызовет перерисовку Memo2 только один раз, а не на каждое изменение.
> CurPos:= AnsiPos(Delimeter, CurStr); (это поиск строки в
> подстроке вроде но зачем этот ansi?)
> Parts.Add(Copy(CurStr, 1, Pred(CurPos))) что такое Pred?
>
AnsiPos - та же самая Pos, но с учетом национальных букв.
Pred - открываем любой учебник по языку паскаль и начинаем вдумчиво читать. Узнаем, что это предыдущее значение от аргумента, а Succ - последующее.
{RASkov} (2008-02-11 23:44:00) [52]> [12] Steep (11.02.08 23:41)
> Delimeterто что удаляем
Это разделитель вообще-то)
> зачем нужны и что делают
Хм.... вот здесь
> теперь я чувствую полный ламмером......
ты прав :(
:)
Ничего нового Игорь не написал, все есть в F1 т.е. - хэлпе...
Anatoly Podgoretsky (2008-02-11 23:43:00) [53]> antonn (11.02.2008 23:38:11) [11]
Таких бить палкой
Steep (2008-02-11 23:41:00) [54]
> Игорь Шевченко ©
эээээ....
теперь я чувствую полный ламмером......
вот что поянл пишем процедуру
StrBreakApart(const Source, Delimeter: string; Parts: TStrings);
где
Source исходная строка
Delimeter то что удаляем
Parts -это то что возвращаем?
зачем нужны и что делают
Parts.BeginUpdate;
CurPos:= AnsiPos(Delimeter, CurStr); (это поиск строки в подстроке вроде но зачем этот ansi?)
Parts.Add(Copy(CurStr, 1, Pred(CurPos))) что такое Pred?
Parts.EndUpdate;
antonn (2008-02-11 23:38:00) [55]
> хм просто и сердито... но вариант от {RASkov} мне понравился
> больше :) (хотя учту на будущее)
мне сейчас лень проверять, а что будет если не #13#10, а #10#13? :)
Игорь Шевченко (2008-02-11 23:36:00) [56]{RASkov} © (11.02.08 23:32) [8]
Это домашнее задание автору.
{RASkov} (2008-02-11 23:35:00) [57]> [7] Steep (11.02.08 23:29)
> искал как переводить строки в массив из char
Они уже) почти так... к каждому символу в String есть доступ по его индексу....
> и искать небуквенные символы....
Легко:
if Stroka[i]<>Буква then Символ с индексом i в строке не буквенный....
{RASkov} (2008-02-11 23:32:00) [58]Из [6]
> procedure TForm1.Button1Click(Sender: TObject);
> var
> S: TStrings;
Не нужен :)
StrBreakApart(StringReplace(Memo1.Text, #13#10, '', [rfReplaceAll]), ', ', Memo2.Lines);
Steep (2008-02-11 23:29:00) [59]я предполагал что там зарыты скрытые символы, но как их выловить я что-то не придумал...
хотел переводить строку на отдельные символы и смотреть что там...
токо вот как это делать не помню - искал как переводить строки в массив из char и искать небуквенные символы....
Игорь Шевченко (2008-02-11 23:28:00) [60]Лови:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure StrBreakApart(const Source, Delimeter: string; Parts: TStrings);
var
curPos: Integer;
curStr: string;
begin
Parts.Clear;
if Length(Source) = 0 then
Exit;
Parts.BeginUpdate;
try
CurStr:= Source;
repeat
CurPos:= AnsiPos(Delimeter, CurStr);
if CurPos > 0 then begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
Length(CurStr)-CurPos-Length(Delimeter)+1);
end else
Parts.Add(CurStr);
until CurPos=0;
finally
Parts.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: TStrings;
begin
S := TstringList.Create;
try
StrBreakApart(StringReplace(Memo1.Text, #13#10, '', [rfReplaceAll]), ', ',
S);
Memo2.Lines.Assign(S);
finally
S.Free;
end;
end;
end.