Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
-
DillerInc
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
Итак,вопрос начинающего программиста заключается в следующем - имеется следующий текст кода:
Цитата:
// Показываем результат
lbOutput.Caption := Trim(edInput1.Text)+' '+cbSign.Items[cbSign.ItemIndex]+' '+
Trim(edInput2.Text)+' = ' ;
...для меня остаётся непонятным,по какому принципу выставляются знаки апострофа и плюса('+)в данном примере.
Не мог бы кто-нибудь разъяснить это дело?
P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" .
Цитата:
// Показываем результат
lbOutput.Caption := Trim(edInput1.Text)+' '+cbSign.Items[cbSign.ItemIndex]+' '+
Trim(edInput2.Text)+' = ' ;
...для меня остаётся непонятным,по какому принципу выставляются знаки апострофа и плюса('+)в данном примере.
Не мог бы кто-нибудь разъяснить это дело?
P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" .
-
shurikan
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
DillerInc
Это просто:
Код:

Это просто:
Код:
Код: Выделить всё
// Показываем результат
// v - этот параметр имеет тип String
lbOutput.Caption := // мы присваиваем ему конкатенацию других строк
Trim(edInput1.Text) // первая
+ // складывается со следующей,
' ' // вот этой. Результат - первая строка с пробелом на конце
+ // складывается с...
cbSign.Items[cbSign.ItemIndex]
+ // в конец результата опять добавляется
' ' // пробел... и т.д.
+
Trim(edInput2.Text)
+
' = ' ;
-
DillerInc
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
Это опять я со своими вопросами.
Итак,вот ситуация:
имеется текстовый файл(как в примере выше),содержащий текст.В этом тексте есть две определённые ошибки,встречающиеся часто на протяжении всего текста.
Так вот как сделать так,чтобы создаваемая программка открывала этот файл,читала его(типа всё как в примере выше),а затем находила эти определённые(неправильные)символы и заменяла их опять-таки определёнными,но уже правильными символами?Возможно ли такое?Если что,пожалуйста,с комментариями.
Итак,вот ситуация:
имеется текстовый файл(как в примере выше),содержащий текст.В этом тексте есть две определённые ошибки,встречающиеся часто на протяжении всего текста.
Так вот как сделать так,чтобы создаваемая программка открывала этот файл,читала его(типа всё как в примере выше),а затем находила эти определённые(неправильные)символы и заменяла их опять-таки определёнными,но уже правильными символами?Возможно ли такое?Если что,пожалуйста,с комментариями.
-
Savant
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
DillerInc
увеличится размер выходного файла (при установке Range или Overflow Checking), но будешь узнавать о всех недосмотрах в коде программы
увеличится размер выходного файла (при установке Range или Overflow Checking), но будешь узнавать о всех недосмотрах в коде программы
-
Savant
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
Можно так (используя WinAPI):
Код:
Код:
Код: Выделить всё
program Project_test;
uses Windows, SysUtils; // Необходимые модули
var
CreateTime, // Дата создания
LastAccess, // Дата последнего доступа
LastWrite // Дата последней записи в файл
: PFileTime;
SystemTime: _SystemTime;
FileHandle: THandle;
begin
New(CreateTime); // Создаем переменную под хранение даты/времени
LastAccess:=nil; // Не изменять эту дату/времени
LastWrite:=nil; // Не изменять эту дату/времени
// Открываем некоторый файл
FileHandle:=FileOpen('Project_test.dpr', fmOpenWrite or fmShareDenyNone);
// Произошла ошибка - выводим диагностическое сообщение
if FileHandle < 1 then MessageBox(0,'Не могу открыть файл','Ошибка',0);
try
GetSystemTime(SystemTime); // Получаем текущее системное время
// Преобразовываем переменную к сжатому виду
SystemTimeToFileTime(SystemTime,CreateTime^);
// Устанавливаем дату и время для файла FileHandle
SetFileTime(FileHandle,CreateTime,LastAccess,LastWrite);
finally
FileClose(FileHandle); // Закрываем дескриптор (файл)
Dispose(LastWrite); // Уничтожаем переменную под хранение даты/времени
end;
end.-
DillerInc
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
Savant
Спасибо,попробую это теперь осмыслить и как-нибудь применить
.
...код переварил,и то,что вышло,прикрепил в файле
.
Вроде работает,но всё равно так и не смог придумать нормальную схему условных операторов в обработчике события OnCloseQuery,поэтому пришлось идти немного обходным путём.
Дело в том,что мне необходимо в этом обработчике проверить не только наличие изменений в открытом документе,но и то,сохранил ли пользователь уже этот документ или нет.И с последним пунктом у меня как раз и возникает загвоздка.
Спасибо,попробую это теперь осмыслить и как-нибудь применить
....код переварил,и то,что вышло,прикрепил в файле
.Вроде работает,но всё равно так и не смог придумать нормальную схему условных операторов в обработчике события OnCloseQuery,поэтому пришлось идти немного обходным путём.
Дело в том,что мне необходимо в этом обработчике проверить не только наличие изменений в открытом документе,но и то,сохранил ли пользователь уже этот документ или нет.И с последним пунктом у меня как раз и возникает загвоздка.
- Вложения
-
Savant
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
Ну нет ничего проще, чем заглянуть в папку .\vcl\source\ и хорошенько там покопаться. Итогом может стать например это:
Код:
>>Т.к. если послать сообщение классу STATIC...[/i]
Замечу, что TMemo относится к "классу" (точнее, типу) EDIT
Код:
Код: Выделить всё
function GetLine(hwnd: Cardinal; Index: Integer): String;
// Получает строку под номером Index из контрола с Handle = hwnd
var
Text: array[0..4095] of Char;
begin
Word((@Text)^) := SizeOf(Text);
SetString(Result, Text, SendMessage(hwnd, EM_GETLINE, Index, Longint(@Text)));
end;
procedure ReplaceLine(hwnd: Cardinal; Index: Integer; const S: String);
// Заменяет строку под номером Index в контроле hwnd на строку S
var
SelStart: Integer;
begin
SelStart := SendMessage(hwnd, EM_LINEINDEX, Index, 0);
if SelStart >= 0 then begin
SendMessage(hwnd, EM_SETSEL, SelStart, SelStart + SendMessage(hwnd, EM_LINELENGTH, SelStart, 0));
SendMessage(hwnd, EM_REPLACESEL, 0, Longint(PChar(S)));
end;
end;
procedure AddToLine(hwnd: Cardinal; Index: Integer; what: String);
// Добавляет к строке под номером Index строку what
begin
ReplaceLine(hwnd, Index, GetLine(hwnd, Index) + what);
end;>>Т.к. если послать сообщение классу STATIC...[/i]
Замечу, что TMemo относится к "классу" (точнее, типу) EDIT
-
serg700
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
DillerInc
Спасибо , попробую ; надеюсь сработает !
Спасибо , попробую ; надеюсь сработает !

-
DillerInc
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
shurikan
Спасибо,конечно,за ответ.
Признаюсь,долго ломал голову над вышенаписанным.Но постараюсь как-нибудь разобраться.Правильно ли я понял,что
Цитата:
Trim(edInput1.Text)+' // это первая складывающаяся строка
'+cbSign.Items[cbSign.ItemIndex]+' // это вторая складывающаяся строка
'+Trim.edInput2.Text)+' // это третья складывающаяся строка
// и между ними стоит везде пробел
...или нет?
Спасибо,конечно,за ответ.
Признаюсь,долго ломал голову над вышенаписанным.Но постараюсь как-нибудь разобраться.Правильно ли я понял,что
Цитата:
Trim(edInput1.Text)+' // это первая складывающаяся строка
'+cbSign.Items[cbSign.ItemIndex]+' // это вторая складывающаяся строка
'+Trim.edInput2.Text)+' // это третья складывающаяся строка
// и между ними стоит везде пробел
...или нет?
-
Новичёк
Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
DillerInc, нет, совсем не правильно 
Строк тут шесть:
Trim(edInput1.Text) //1-ая
' ' //2-ая, содержит один-единственный пробел для //разделения
cbSign.Items[cbSign.ItemIndex] // 3-я
' ' // 4-я, опять только пробел
Trim(edInput2.Text) // 5-я
' = ' // символ "=" с пробелами - разделителями
Ты, как я понял, решил, что знаки конкатенации ("+") надо заключать вместе со строкой в апострофы? Если нет, то извини, зря я шум поднял
, а если нет... Вобщем, плюсы ЗА апострофами, просто строка тута такая, что можно запутаться 

Строк тут шесть:
Trim(edInput1.Text) //1-ая
' ' //2-ая, содержит один-единственный пробел для //разделения
cbSign.Items[cbSign.ItemIndex] // 3-я
' ' // 4-я, опять только пробел
Trim(edInput2.Text) // 5-я
' = ' // символ "=" с пробелами - разделителями
Ты, как я понял, решил, что знаки конкатенации ("+") надо заключать вместе со строкой в апострофы? Если нет, то извини, зря я шум поднял
, а если нет... Вобщем, плюсы ЗА апострофами, просто строка тута такая, что можно запутаться 