Показать полную графическую версию : *Флейм* | Delphi. Синтаксис. Использование WinAPI
DillerInc
19-11-2004, 17:41
Итак,вопрос начинающего программиста заключается в следующем - имеется следующий текст кода:
// Показываем результат
lbOutput.Caption := Trim(edInput1.Text)+' '+cbSign.Items[cbSign.ItemIndex]+' '+
Trim(edInput2.Text)+' = ' ;
...для меня остаётся непонятным,по какому принципу выставляются знаки апострофа и плюса('+)в данном примере.
Не мог бы кто-нибудь разъяснить это дело?
P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" .
shurikan
19-11-2004, 20:05
DillerInc
Это просто:
// Показываем результат
// v - этот параметр имеет тип String
lbOutput.Caption := // мы присваиваем ему конкатенацию других строк
Trim(edInput1.Text) // первая
+ // складывается со следующей,
' ' // вот этой. Результат - первая строка с пробелом на конце
+ // складывается с...
cbSign.Items[cbSign.ItemIndex]
+ // в конец результата опять добавляется
' ' // пробел... и т.д.
+
Trim(edInput2.Text)
+
' = ' ;
:)
DillerInc
19-11-2004, 23:27
shurikan
Спасибо,конечно,за ответ.
Признаюсь,долго ломал голову над вышенаписанным.Но постараюсь как-нибудь разобраться.Правильно ли я понял,что
Trim(edInput1.Text)+' // это первая складывающаяся строка
'+cbSign.Items[cbSign.ItemIndex]+' // это вторая складывающаяся строка
'+Trim.edInput2.Text)+' // это третья складывающаяся строка
// и между ними стоит везде пробел
...или нет?
DillerInc, нет, совсем не правильно :(
Строк тут шесть:
Trim(edInput1.Text) //1-ая
' ' //2-ая, содержит один-единственный пробел для //разделения
cbSign.Items[cbSign.ItemIndex] // 3-я
' ' // 4-я, опять только пробел
Trim(edInput2.Text) // 5-я
' = ' // символ "=" с пробелами - разделителями
Ты, как я понял, решил, что знаки конкатенации ("+") надо заключать вместе со строкой в апострофы? Если нет, то извини, зря я шум поднял ;), а если нет... Вобщем, плюсы ЗА апострофами, просто строка тута такая, что можно запутаться :)
DillerInc
20-11-2004, 00:58
Новичёк
Потихоньку туман начинает рассеиваться,в любом случае,огромное спасибо за разъяснения :) .
P.S. Удивительно,почему в той самой книге Фаронова об этом ничего не говорится.
DillerInc
26-12-2004, 22:17
Господа,имеется следующий код:
unit AssignFileU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TfmExample = class(TForm)
Panel1: TPanel;
bbRun: TBitBtn;
bbClose: TBitBtn;
edInput: TEdit;
lbOutput: TLabel;
mmOutput: TMemo;
procedure bbRunClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmExample: TfmExample;
implementation
{$R *.dfm}
procedure TfmExample.bbRunClick(Sender: TObject);
var
F : TextFile;
S : String;
begin
AssignFile(F, 'Passion.srt');
Reset(F);
while not EOF(F) do
begin
ReadLn(F,S);
mmOutput.Lines.Add(S)
end;
CloseFile(F)
end;
Так вот при прогоне этой программы Delphi выдаёт мне ошибку "Declaration expected but end of file found".
Подскажите,пожалуйста,как это можно исправить и в чём тут дело.
hasherfrog
27-12-2004, 09:36
Энд с точкой?
DillerInc
27-12-2004, 19:49
hasherfrog
Если я ставлю end.,он помимо вышеупомянутого сообщения об ошибке выдаёт ещё одно :
";" expected but "." found
Вроде бы он в первом сообщении просит что-то объявить(declaration),а что...?
DillerInc
27-12-2004, 21:34
hasherfrog
То ли я тебя неправильно понял,то ли ещё что... :)
Короче,в конец кода надо было просто добавить недостающее end.,и тогда всё становится путём.
hasherfrog
28-12-2004, 00:10
:lol: Короче, дело к ночи.
недостающее end. - Энд с точкой, как и было сказано :)
Бегин с кисточкой. Скобка ласточкой. Кхм. Где комодеры?
DillerInc
28-12-2004, 23:24
Это опять я со своими вопросами.
Итак,вот ситуация:
имеется текстовый файл(как в примере выше),содержащий текст.В этом тексте есть две определённые ошибки,встречающиеся часто на протяжении всего текста.
Так вот как сделать так,чтобы создаваемая программка открывала этот файл,читала его(типа всё как в примере выше),а затем находила эти определённые(неправильные)символы и заменяла их опять-таки определёнными,но уже правильными символами?Возможно ли такое?Если что,пожалуйста,с комментариями.
hasherfrog
29-12-2004, 09:03
Найти что-то в тексте (разобрать его на составляющие, или по-научному "пропарсить" :rotate:) - одна из наиболее простых и частых задач программирования. Подробнее, какие трудности? И вообще, зачем писать программу? Обычно в таких случаях хватает CTRL+R.
DillerInc
29-12-2004, 17:14
hasherfrog
Дело в том,что есть такая программка как SubRip,которая выдирает титры из VOB-файлов.Всё работает замечательно,но если титры русские,есть одна запара - программа не распознаёт русской буквы "ы",поэтому при обработке таких титров в теле самой программы вместо "ы" приходится писать "ьl".Этот недостаток можно,конечно,потом самому "ручками" в текстовом редакторе исправить,но это довольно муторно.Поэтому я и хочу автоматизировать этот процесс.
При написании кода для меня остаётся непонятным,как заставить программу найти то,что я ищу,т.е. необходимо ввести какие-то переменные(возможно типа Char)и воспользоваться какой-то процедурой или функцией,чтобы найти нужные символы и затем с помощью оператора присваивания исправить их на нужные,так что ли?
DillerInc
31-12-2004, 18:35
В общем-то,вот некоторые намётки:
Function GetSymb(sbInp: String) : String;
{Эта кустарная функция должна преобразовывать определённые символы в нужные}
var
k : Integer;
begin
Result := sbInp;
for k := 1 to Length(Result) do
begin
if Result[k] = 'l' then
Result[k] := Chr(Ord('ы'));
if Result[k] = 'ь' then
Delete(sbInp,Ord('ь'),1);
end;
end; // GetSymb
...но я никак не могу добиться,чтобы процедура Delete уничтожала символ "ь" .
Следовательно,в чём может быть ошибка?
DillerInc
Привет!
Ну что ж, подправим твою "кустарную" функцию:
Function GetSymb(sbInp: String) : String;
{Эта кустарная функция должна преобразовывать определённые символы в нужные}
var
k : Integer;
begin
Result := sbInp;
for k := 1 to Length(Result)-1 do
if (Result[k] = 'ь') and (Result[k+1] = 'l') then begin
Result[k] := 'ы'; Delete(Result,k+1,1);
end;
end; // GetSymb
На заметку: подучи функции Pos, Delete и Ord. Ты их неверно используешь
Можно и проще, не используя Result (в виде - procedure Convert(var sbInp: String); )
Кстать, а на php/perl такие задачи ваще халява: $your_text=preg_replace('ьl','ы',$your_text);
DillerInc
01-01-2005, 16:35
Savant
Получилось - ну,спасибо!!!
:applause:
Да,кстати,с Наступившим тебя!
DillerInc
Да ладно? а если я скажу, что в функции была ошибка, не замеченная мною по случаю Нового Года? :) Я тока щас заметил. Кто рабирается в программировании, сразу ее заметит. Правда, я не знаю, как на ошибку среагирует delphi, поскольку нет возможности проверить код в действии.
Перепишу код (и заодно в новом варианте, про который я упоминал):
procedure ConvertStr(var sbInp : String);
{Эта кустарная функция должна преобразовывать определённые символы в нужные}
var
k : Integer;
begin
k := 1;
while k < Length( Result ) do begin
if (sbInp[k] = 'ь') and (sbInp[k+1] = 'l') then begin
sbInp[k] := 'ы';
Delete(sbInp,k+1,1);
end;
inc(k);
end;
end; // ConvertStr
Если нужен вариант в виде функции, то можно добавить:
function ConvertStrF(const sbInp: String) : String;
begin
Result := sbInp;
ConvertStr(Result);
end;
DillerInc
01-01-2005, 17:37
Savant
Да ладно? а если я скажу, что в функции была ошибка
...не знаю,не знаю.Код реализовал,проверил - откомпилированная программа работает исправно.
Если не секрет,то,что за ошибка(для тех,кто с трудом разбирается в программировании :) )?
DillerInc
Да не секрет конечно... :)
Обрати внимание - в цикле for предельное значение переменной k является константой начальной длины входной строки, уменьшенной на единицу. А в процессе замены длина строки уменьшается с каждой заменой на 1 (а предельное значение является константой и не уменьшается), поэтому, если в конце обрабатываемой строки будет "ьl" и несколько "ьl" где-то в середине, то возможно в процедуре Delete() или при чтении из Result[k], где k в данный момент времени уже больше Length(Result), возникнет исключение. Но, к счастью, этого не происходит ни там ни там (хотя не очень понятно почему, может наадо включить Overflow Checking?). Ага, я ток что заглянул в справку по Дельфям и прочитал там кое-что интересное насчет Delete() (исключение генерироваться не будет при выходе за пределы строки):
procedure Delete(var S: string; Index, Count: Integer);
Description
In Delphi code, Delete removes a substring of Count characters from string S starting with S. S is a string-type variable. Index and Count are integer-type expressions.
[i]If index is larger than the length of the string or less than 1, no characters are deleted.
If count specifies more characters than remain starting at the index, Delete removes the rest of the string. If count is less than or equal to 0, no characters are deleted.Поэтому изначальный код хоть и работает , но имеет некоторые изъяны. Только маленький вопрос напоследок, а Overflow Checking у тебя включен ?
Или Range Checking...
DillerInc
01-01-2005, 18:44
Savant
Огромное спасибо за помощь и советы :) .
а Overflow Checking у тебя включен ?
...нет,не включен.Лучше включить?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.