Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Внизстроки.... Найти похожие ветки
← →
Steep (2008-02-11 23:06) [0]суть такая берем первый 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;
как недопустить их появления? в чем может быть ошибка?
← →
antonn © (2008-02-11 23:15) [1]удаляй символы перевода строки #13#10 в Memo1.Text
← →
Steep (2008-02-11 23:20) [2]хм... а как их искать и удалять?
ведь pos("#13", AllText) так точно не задаш... (точнее задаш но не найдет....)
← →
{RASkov} © (2008-02-11 23:21) [3]> [2] Steep (11.02.08 23:20)
begin
x := false;
AllText := StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]);
← →
antonn © (2008-02-11 23:21) [4]pos(#13,"стриииинг")
а так? :)
← →
Steep (2008-02-11 23:24) [5]
> {RASkov} ©
круто... эх... как стать таким умным :)
> antonn ©
хм просто и сердито... но вариант от {RASkov} мне понравился больше :) (хотя учту на будущее)
← →
Игорь Шевченко © (2008-02-11 23:28) [6]Лови:
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.
← →
Steep (2008-02-11 23:29) [7]я предполагал что там зарыты скрытые символы, но как их выловить я что-то не придумал...
хотел переводить строку на отдельные символы и смотреть что там...
токо вот как это делать не помню - искал как переводить строки в массив из char и искать небуквенные символы....
← →
{RASkov} © (2008-02-11 23:32) [8]Из [6]
> procedure TForm1.Button1Click(Sender: TObject);
> var
> S: TStrings;
Не нужен :)StrBreakApart(StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]), ", ", Memo2.Lines);
← →
{RASkov} © (2008-02-11 23:35) [9]> [7] Steep (11.02.08 23:29)
> искал как переводить строки в массив из char
Они уже) почти так... к каждому символу в String есть доступ по его индексу....
> и искать небуквенные символы....
Легко:
if Stroka[i]<>Буква then Символ с индексом i в строке не буквенный....
← →
Игорь Шевченко © (2008-02-11 23:36) [10]{RASkov} © (11.02.08 23:32) [8]
Это домашнее задание автору.
← →
antonn © (2008-02-11 23:38) [11]
> хм просто и сердито... но вариант от {RASkov} мне понравился
> больше :) (хотя учту на будущее)
мне сейчас лень проверять, а что будет если не #13#10, а #10#13? :)
← →
Steep (2008-02-11 23:41) [12]
> Игорь Шевченко ©
эээээ....
теперь я чувствую полный ламмером......
вот что поянл пишем процедуру
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;
← →
Anatoly Podgoretsky © (2008-02-11 23:43) [13]> antonn (11.02.2008 23:38:11) [11]
Таких бить палкой
← →
{RASkov} © (2008-02-11 23:44) [14]> [12] Steep (11.02.08 23:41)
> Delimeter то что удаляем
Это разделитель вообще-то)
> зачем нужны и что делают
Хм.... вот здесь
> теперь я чувствую полный ламмером......
ты прав :(
:)
Ничего нового Игорь не написал, все есть в F1 т.е. - хэлпе...
← →
Игорь Шевченко © (2008-02-11 23:45) [15]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 - последующее.
← →
Steep (2008-02-11 23:58) [16]
> Это домашнее задание автору.
задание вроде понял =)
еще понял что все таки мы в процедуре сразу ищем ", " и кидаем слова в список который потом отдаем во второе мемо
> мне сейчас лень проверять, а что будет если не #13#10, а
> #10#13? :)
вроде после #13 (вроде ентер ) может идти #10 (символ каретки вроде как), а наоборот я не уверен
> Anatoly Podgoretsky ©
зачем так жестко?
> Это разделитель вообще-то)
угу понял...
> > теперь я чувствую полный ламмером......
> ты прав :(
>:)
>Ничего нового Игорь не написал, все есть в F1 т.е. - хэлпе...
угу я думаю я хоть что начал понимать в итоге чувствую что все что я знаю это ничто по сравнению с тем что есть.... чето как то и желание программировать отпадать начинает....
Насчет F1 есть... токо как узнать есть ли команды типа StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]);
с которыми бьешся бьешся а в итоге оказывается что это было....
я понимаю по справке можно посмотреть у известной команды параметры - и если не обчень понятно пример.... а как узнать что там вобще есть.....
← →
antonn © (2008-02-11 23:59) [17]
> Anatoly Podgoretsky © (11.02.08 23:43) [13]
>
> > antonn (11.02.2008 23:38:11) [11]
>
> Таких бить палкой
>
нет, бить палкой тех программеров, которые не учли вольный ввод пользователя. Не имхо. Для мемо по-барабану как идет перенос строки и перевод каретки.
← →
{RASkov} © (2008-02-12 00:02) [18]> 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;
Может подойдет? :)
← →
ketmar © (2008-02-12 00:03) [19]>[17] antonn © (2008-02-11 23:59:00)
бить палкой тех идиотов, которые делают разделение строк как #10#13. эти символы пользователь точно не вводит руками. это только кривая софтина может такое родить. автора такой софтины кастрировать, и вывесить на фонарь — для вразумления остальных.
---
Understanding is not required. Only obedience.
← →
Steep (2008-02-12 00:04) [20]
> Игорь Шевченко ©
спасибо - хоть что то я начинаю понимать....
← →
ketmar © (2008-02-12 00:04) [21]интересно, почему никто не вспомнил про TStrings.CommaText?
---
Understanding is not required. Only obedience.
← →
Steep (2008-02-12 00:11) [22]
> Может подойдет? :)
ээээ.... что-то я понимаю что чем мудренее проблема тем решенее лучше если оно проще.....
← →
Steep (2008-02-12 00:21) [23]теперь зародилась несколько другая проблема... при копировании, а затем вставки вместо русского текста нечитаемый набор символов...
нужно исползовать юникод? или можно както скопировать нормально?
← →
Игорь Шевченко © (2008-02-12 00:26) [24]
> теперь зародилась несколько другая проблема... при копировании,
> а затем вставки вместо русского текста нечитаемый набор
> символов...
Клавиатуру на русский переключи перед копированием :)
← →
Johnmen © (2008-02-12 00:27) [25]Зачем использовать аффигенно тормознутые ф-ии, если можно написать быстрый однопроходный код?
Типа этого: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;
← →
Johnmen © (2008-02-12 00:28) [26]
> ketmar © (12.02.08 00:04) [21]
> интересно, почему никто не вспомнил про TStrings.CommaText?
Потому, что и пробел является неотменным разделителем.
← →
Steep (2008-02-12 00:34) [27]
> Зачем использовать аффигенно тормознутые ф-ии, если можно
> написать быстрый однопроходный код?
потомучто у меня не миллионы слов - а маленький код понять легче - ну если не понять то хотя бы меньше кода....
> Клавиатуру на русский переключи перед копированием :)
помогло... неужели програмно переключать чтобы работало наверняка?
← →
Johnmen © (2008-02-12 00:36) [28]
> потомучто у меня не миллионы слов - а маленький код понять
> легче - ну если не понять то хотя бы меньше кода....
Если ты так реально считаешь, то ты не станешь программистом.
Да тебе, как я уже понял, и не надо...
← →
ketmar © (2008-02-12 00:38) [29]>[27] Steep (2008-02-12 00:34:00)
>неужели програмно переключать чтобы работало наверняка?
мегебаянЪ.
мне вот интересно, почему 99.9% вопрошающих про «кракозяблы в буфере обмена» никогда не задумываются, какое именно магическое действие совершает переключение раскладки, и как можно добиться того же, но раскладку не дёргать?
---
Understanding is not required. Only obedience.
← →
ketmar © (2008-02-12 00:39) [30]>[26] Johnmen © (2008-02-12 00:28:00)
хм. а, ну да. строки с пробелами кавычить надо. каюсь, забыл.
---
Understanding is not required. Only obedience.
← →
Игорь Шевченко © (2008-02-12 00:45) [31]ketmar © (12.02.08 00:38) [29]
> и как можно добиться того же, но раскладку не дёргать?
Научи, а ? Я на самом деле не знаю "как добиться того же", чтобы из любых Delphi-ских Editов по стандартным командам копирования добиться вставки в юникодные программы корректного русского текста. Я серьезно.
← →
Steep (2008-02-12 00:58) [32]вот нашел....
procedure BufferToClipboard(Buffer: WideString);
var WideBuffer: WideString;
BuffSize: Cardinal;
Data: THandle;
DataPtr: Pointer;
begin
if Buffer <> "" then begin
WideBuffer := Buffer;
BuffSize := length(Buffer) * SizeOf(WideChar);
Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE+GMEM_ZEROINIT, BuffSize + 2);
try
DataPtr := GlobalLock(Data);
try
Move(PWideChar(WideBuffer)^, Pointer(Cardinal(DataPtr))^, BuffSize);
finally
GlobalUnlock(Data);
end;
Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
except
GlobalFree(Data);
raise;
end;
end;
end;
вызов процедурыBufferToClipboard(" hello world");
← →
Игорь Шевченко © (2008-02-12 01:02) [33]Steep (12.02.08 00:58) [32]
Это не то. Это я и сам умею. А мне надо, чтобы из любого Edit"а стандартным нажатием Ctrl+C в clipboard получался хороший русский текст.
← →
Steep (2008-02-12 01:05) [34]unit файл
unit RusClipboard;
interface
uses Clipbrd;
type
TRusClipboard = class(TClipboard)
private
procedure SetCodePage(const CodePage: longint);
public
procedure Open; override;
procedure Close; override;
end;
implementation
uses Windows;
{ TRusClipboard }
procedure TRusClipboard.Close;
begin
SetCodePage($0419);
inherited;
end;
procedure TRusClipboard.Open;
begin
inherited;
SetCodePage($0419);
end;
procedure TRusClipboard.SetCodePage(const CodePage: longint);
var
Data: THandle;
DataPtr: Pointer;
begin
// Назначить кодовую страницу для буфера обмена
Data:= GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, 4);
try
DataPtr := GlobalLock(Data);
try
Move(CodePage, DataPtr^, 4);
SetClipboardData(CF_LOCALE, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
end;
end;
var
FClipboard: TClipboard;
OldClipboard: TClipboard;
initialization
{Установить клипборд}
FClipboard:= TRusClipboard.Create;
OldClipboard:= SetClipboard(FClipboard);
if OldClipboard <> nil then OldClipboard.Free;
end.
← →
Steep (2008-02-12 01:10) [35]
> Это не то. Это я и сам умею. А мне надо, чтобы из любого
> Edit"а стандартным нажатием Ctrl+C в clipboard получался
> хороший русский текст.
наверно как то обрабатывать нажатие клавиш...
← →
Steep (2008-02-12 01:23) [36]типо
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Shift = [ssCtrl]) and (Key = ord("C")) then
begin
скопировать выделенный текст в буфер в нормальном виде :)))
end;
end;
← →
antonn © (2008-02-12 01:28) [37]
> ketmar © (12.02.08 00:03) [19]
[17] прочитай внимательно, запиши на бумажке и запомни.
пользователи, они такие, тянутся к тому продукту, который проще и надежней. и не бьет палкой. именно поэтому микрософт продает, зарабатывает и имеет бОльшую аудиторию, а ты сидишь в какой нибудь консоли и скрипишь зубами от зависти.
%)
← →
Германн © (2008-02-12 01:31) [38]
> antonn © (12.02.08 01:28) [37]
Иногда лучше жевать.
← →
antonn © (2008-02-12 01:32) [39]
> Германн © (12.02.08 01:31) [38]
>
>
> > antonn © (12.02.08 01:28) [37]
>
> Иногда лучше жевать.
Вот и я ему говорю.
← →
ketmar © (2008-02-12 01:41) [40]>[31] Игорь Шевченко © (2008-02-12 00:45:00)
тогда сначала научи, как добиться этого при помощи программного переключения раскладок. и чтобы юзер при сём не нервничал.
>[37] antonn © (2008-02-12 01:28:00)
я так рад, что ты обо мне много знаешь. можно, я тебе пожалуюсь? соседи постоянно в стену стучат: им мой скрип зубов по ночам спать мешает. я уже три вставных челюсти сточил, да…
я так полагаю, ты плевать хотел на m$, и денег у тебя больше, чем у них? я за тебя рад.
если не больше — не вякай глупости, а?
---
Understanding is not required. Only obedience.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.102 c