![]() |
*Флейм* | Delphi. Синтаксис. Использование WinAPI
Итак,вопрос начинающего программиста заключается в следующем - имеется следующий текст кода:
Цитата:
Не мог бы кто-нибудь разъяснить это дело? P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" . |
DillerInc
Это просто: Код:
// Показываем результат |
shurikan
Спасибо,конечно,за ответ. Признаюсь,долго ломал голову над вышенаписанным.Но постараюсь как-нибудь разобраться.Правильно ли я понял,что Цитата:
|
DillerInc, нет, совсем не правильно :(
Строк тут шесть: Trim(edInput1.Text) //1-ая ' ' //2-ая, содержит один-единственный пробел для //разделения cbSign.Items[cbSign.ItemIndex] // 3-я ' ' // 4-я, опять только пробел Trim(edInput2.Text) // 5-я ' = ' // символ "=" с пробелами - разделителями Ты, как я понял, решил, что знаки конкатенации ("+") надо заключать вместе со строкой в апострофы? Если нет, то извини, зря я шум поднял ;), а если нет... Вобщем, плюсы ЗА апострофами, просто строка тута такая, что можно запутаться :) |
Новичёк
Потихоньку туман начинает рассеиваться,в любом случае,огромное спасибо за разъяснения :) . P.S. Удивительно,почему в той самой книге Фаронова об этом ничего не говорится. |
Господа,имеется следующий код:
Код:
unit AssignFileU; Подскажите,пожалуйста,как это можно исправить и в чём тут дело. |
Энд с точкой?
|
hasherfrog
Если я ставлю end.,он помимо вышеупомянутого сообщения об ошибке выдаёт ещё одно : Код:
";" expected but "." found |
hasherfrog
То ли я тебя неправильно понял,то ли ещё что... :) Короче,в конец кода надо было просто добавить недостающее end.,и тогда всё становится путём. |
:lol: Короче, дело к ночи.
недостающее end. - Энд с точкой, как и было сказано :) Бегин с кисточкой. Скобка ласточкой. Кхм. Где комодеры? |
Это опять я со своими вопросами.
Итак,вот ситуация: имеется текстовый файл(как в примере выше),содержащий текст.В этом тексте есть две определённые ошибки,встречающиеся часто на протяжении всего текста. Так вот как сделать так,чтобы создаваемая программка открывала этот файл,читала его(типа всё как в примере выше),а затем находила эти определённые(неправильные)символы и заменяла их опять-таки определёнными,но уже правильными символами?Возможно ли такое?Если что,пожалуйста,с комментариями. |
Найти что-то в тексте (разобрать его на составляющие, или по-научному "пропарсить" :rotate:) - одна из наиболее простых и частых задач программирования. Подробнее, какие трудности? И вообще, зачем писать программу? Обычно в таких случаях хватает CTRL+R.
|
hasherfrog
Дело в том,что есть такая программка как SubRip,которая выдирает титры из VOB-файлов.Всё работает замечательно,но если титры русские,есть одна запара - программа не распознаёт русской буквы "ы",поэтому при обработке таких титров в теле самой программы вместо "ы" приходится писать "ьl".Этот недостаток можно,конечно,потом самому "ручками" в текстовом редакторе исправить,но это довольно муторно.Поэтому я и хочу автоматизировать этот процесс. При написании кода для меня остаётся непонятным,как заставить программу найти то,что я ищу,т.е. необходимо ввести какие-то переменные(возможно типа Char)и воспользоваться какой-то процедурой или функцией,чтобы найти нужные символы и затем с помощью оператора присваивания исправить их на нужные,так что ли? |
В общем-то,вот некоторые намётки:
Код:
Function GetSymb(sbInp: String) : String; Следовательно,в чём может быть ошибка? |
DillerInc
Привет! Ну что ж, подправим твою "кустарную" функцию: Код:
Function GetSymb(sbInp: String) : String; Можно и проще, не используя Result (в виде - procedure Convert(var sbInp: String); ) Кстать, а на php/perl такие задачи ваще халява: $your_text=preg_replace('ьl','ы',$your_text); |
Savant
Получилось - ну,спасибо!!! :applause: Да,кстати,с Наступившим тебя! |
DillerInc
Да ладно? а если я скажу, что в функции была ошибка, не замеченная мною по случаю Нового Года? :) Я тока щас заметил. Кто рабирается в программировании, сразу ее заметит. Правда, я не знаю, как на ошибку среагирует delphi, поскольку нет возможности проверить код в действии. Перепишу код (и заодно в новом варианте, про который я упоминал): Код:
procedure ConvertStr(var sbInp : String); Код:
function ConvertStrF(const sbInp: String) : String; |
Savant
Цитата:
Если не секрет,то,что за ошибка(для тех,кто с трудом разбирается в программировании :) )? |
DillerInc
Да не секрет конечно... :) Обрати внимание - в цикле for предельное значение переменной k является константой начальной длины входной строки, уменьшенной на единицу. А в процессе замены длина строки уменьшается с каждой заменой на 1 (а предельное значение является константой и не уменьшается), поэтому, если в конце обрабатываемой строки будет "ьl" и несколько "ьl" где-то в середине, то возможно в процедуре Delete() или при чтении из Result[k], где k в данный момент времени уже больше Length(Result), возникнет исключение. Но, к счастью, этого не происходит ни там ни там (хотя не очень понятно почему, может наадо включить Overflow Checking?). Ага, я ток что заглянул в справку по Дельфям и прочитал там кое-что интересное насчет Delete() (исключение генерироваться не будет при выходе за пределы строки): Цитата:
Или Range Checking... |
Savant
Огромное спасибо за помощь и советы :) . Цитата:
|
DillerInc
увеличится размер выходного файла (при установке Range или Overflow Checking), но будешь узнавать о всех недосмотрах в коде программы |
Чего-то я запутался в следующем:
Код:
procedure TfmSubRip_Mod.bbOpenClick(Sender: TObject); Код:
lbOutput := 'Повторите операцию "Открыть файл" '; |
DillerInc
Код:
procedure TfmSubRip_Mod.bbOpenClick(Sender: TObject); |
Savant
Ай да Savant - выручатель мой!Действительно получилось,как я хотел. Спасибо :) . |
Доброго всем времени суток!
Это снова я...со своими вопросами.А именно,имеется вопрос по использованию переменных в подпрограммах. Код: Код:
unit FileDateU; Код:
var Подскажите,пожалуйста,что я не так понимаю и как можно поправить ситуацию? |
DillerInc
Цитата:
Код:
program Project_test; Код:
var TEST: Integer = 5; // объявляем глобальную переменную |
Ах да, еще спрашивалось, как подправить. Ну, думаю, это уже стало понятно - сделать FileHandle глобальной:
Код:
........... |
Savant
Спасибо,действительно начинает потихоньку мотаться на ус,только для меня теперь остаётся непонятным использование секции интерфейсных объявлений(interface) и секции реализаций(implementation),т.е. всегда ли можно объявлять глобальные переменные в секции реализаций и какие там есть особенности или можно также использовать т.н. поля класса - объявления переменных в следующем месте: private {Private declarations} ...? |
1. Переменная, объявленная внутри implementation будет доступна всему коду , расположенному ниже её объявления.
2. Переменная, объявленная внутри interface будет доступна всему коду , расположенному ниже её объявления, а также программе, которая использует данный unit. 3. Переменная, объявленная внутри секции private будет доступна только для внутренних вызовов из данного класса. |
Savant
Премного благодарю :) . Теперь немного о функциях рассмотренного выше кода,а именно функции FileGetDate и FileSetDate - насколько я впоследствии понял,они орудуют датой последней модификации определённого файла.А я хотел,чтобы программка изменяла именно дату создания файла.Так вот вопрос: возможно ли такое "дельфийскими силами" и какие функции тогда использовать? |
Можно так (используя WinAPI):
Код:
program Project_test; |
Savant
...хм...хм...ну,ничего себе...в любом случае спасибо - попробую :) . |
DillerInc
Я тут сижу и думаю: какая идиллия!.. Я помогаю тебе осваивать Obj. Pascal , а frizzn по сути так же хелпает мне с Си/Си++ :) Нет, ну просто умора :lol: |
Savant
Взяв в пример код,приведённый тобой выше(который я,кстати,так и не компилировал,т.к. толку создавать программу,если я не до конца понимаю алгоритма её работы)...в общем,решил я залесть в дебри функций WinAPI(типа те,в модуле Windows.pas)и окончательно потерялся :gigi: . Во-первых,правильно ли,что... PFileTime = ^TFileTime ...и можно ли так объявлять эти типизированные указатели,т.е. ... CreationTime : ^TFileTime; Во-вторых,как понимать запись: _SystemTime ...т.е. именно это подчёркивание впереди? Далее имеется API-функция: function GetFileTime(hFile: THandle; lpCreationTime, lpLastAccessTime, lpLastWriteTime: PFileTime): BOOL; stdcall; Хотелось бы уточнить,что представляют из себя буквы lp,например: lpCreationTime ? Результатом этой функции является значение логического типа BOOL,спрашивается: как я могу использовать это логиское значение,если я хочу вывести,к примеру,вывести дату создания файла в Label1.Caption?И ведь,по-моему,в модулях SysUtils.pas и Windows.pas нету какой-нибудь функции типа FileTimeToDateTime,или...? Заранее прошу прощения,если уж очень пристаю со своими вопросами :) . |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Кстати есть FileTimeToSystemTime(); |
Savant
В общем,насчёт функции GetFileTime - в одном месте подсмотрел :biggrin: : Код:
Procedure A; |
DillerInc
При использовании маленьких переменных - практически все равно, что использовать - динамическое создание/уничтожение переменных ( New(), Dispose() ) или статическое. Мне просто уже привычно работать с динамическим выделением буфера и поэтому я привёл свой пример в том виде в каком привёл :biggrin: . В данном случае я действительно немного переборщил, можно было обойтись одной "собачкой", которая возвращает адрес элемента, стоящего за ней (причем не только переменной, но также функции). Процедура New необходима, когда используются буферы (переменные) по несколько МБайт. |
Savant
Цитата:
|
Для начала - с челобитной к ув. Модераторам: с какой стати тему окрестили как Флейм?По-моему,здесь идёт самый настоящий процесс разгрызания гранита науки :biggrin: ,т.е. на мой взгляд точнее было бы назвать тему *Практика*|Delphi. Синтаксис или что-то наподобие.
:pray: Далее...помогите,господа,пожалуйста по следующему делу: хочу вставить в программу возможность показа сообщения типа mtConfirmation(ну,если пользователь сделал какие-то изменения в открытом документе и хочет выйти из программы,не сохранив эти изменения.Т.к. подобного компонента-диалога в среде Delphi вроде нету,я написал пробный обработчик события нажатия кнопки: Код:
procedure TfmExample.bbRunClick(Sender: TObject); Насколько я понимаю,необходимо сделать обработчик события OnCloseQuery основной формы и,применяя условные операторы,вывести в нужный момент на экран диалоговое сообщение...а вот как это сделать логически правильно? |
Вложений: 1
Объяснять долговато, лучше на примере.
Вот, наклепал по-быстрому, но хоть понятно что-то... |
Вложений: 1
Savant
Спасибо,попробую это теперь осмыслить и как-нибудь применить :) . ...код переварил,и то,что вышло,прикрепил в файле :) . Вроде работает,но всё равно так и не смог придумать нормальную схему условных операторов в обработчике события OnCloseQuery,поэтому пришлось идти немного обходным путём. Дело в том,что мне необходимо в этом обработчике проверить не только наличие изменений в открытом документе,но и то,сохранил ли пользователь уже этот документ или нет.И с последним пунктом у меня как раз и возникает загвоздка. |
В общем,как можно догадаться - у меня снова вопросы...
...а именно,необходимо получить ссылку на какое-нибудь окно - то бишь т.н. Handle Window (HWND).И не просто получить,а вывести её как-то в виде символов,к примеру,в компоненте TLabel(метка). Значит в чём заключается вопрос...имеется функция WinAPI : function FindWindow(lpClassName, lpWindowName : PChar) : HWND; ...возвращающая "хэндл" искомого окна.А вот как теперь этому значению придать наглядный вид,чтобы отобразить символьно это значение в той же метке? Возможно ли такое вообще,если да,то как?С помощью каких функций? |
DillerInc
Сначала теория: хэндл окна представляет собой просто двойное слово, т.е. 32-битное число. Число можно представить в символьной форме функцией Int2Str. А например с помощью GetWindowText() можно получить заголовок окна. Функций работы с окнами очень много, конкретизируйте цель пожалуйста... |
Savant
Цель - использование этого самого хэндла,32-битного числа,в другой программе,т.е. мне необходимо прописать в другой программе это значение как один из параметров для выполнения определённой команды.Именно поэтому мне необходимо получить символьное представление значения типа HWND. Цитата:
Код:
procedure A; Цитата:
|
DillerInc
Цитата:
Цитата:
Код:
var |
Savant
Спасибо за информацию - будем мотать на ус :) . |
Доброго всем времени суток!
Это называется - сижу, туплю... Как можно грамотно на Delphi организовать оператор выбора case..of..end;, чтобы он был не такой примитивный как обычно его описывают,например: Код:
case Ch of Можно сделать,конечно,и так: Код:
if dEvent.dwDebugEventCode = LOAD_DLL_DEBUG_EVENT then // Первый вариант константы выбора Следовательно - как быть ? |
DillerInc
Не совсем понятно, как "каждая константа выбора" может содержать "определённый кусок кода" ))). Да к тому же в общем случае процессорное время будет все равно уходить (но меньше), т.к. программа будет последовательно (хотя и это зависит от компилятора, где-то могут для поиска (при большом кол-ве вариантов) использоваться другие алгоритмы) сравнивать значения, пока не найдёт подходящее. Но если Ваша мысля дошла, то есть два (в принципе одинаковых) решения: 1) внешние операторы if преобразовать к виду Код:
if dEvent.dwDebugEventCode = LOAD_DLL_DEBUG_EVENT then begin Код:
case dEvent.dwDebugEventCode of |
Savant
Спасибо за разъяснения насчёт case .. of .. end . Сейчас вот подумал,потом глянул это дело в отладчике - действительно оба решения в принципе одинаковы :) . |
Вот ещё один вопрос возник:
в Delphi есть объект класса TMemo. У его свойтсва Lines имеются методы Add и Append. Так вот как можно с помощью WinAPI организовать процедуру,аналогичную дельфийскому методу Append ? Т.к. если послать сообщение классу STATIC... Код:
SendMessage(handleStatic, WM_SETTEXT, 0, lParam('К примеру '+IntToHex(some_stuff))); |
Ну нет ничего проще, чем заглянуть в папку .\vcl\source\ и хорошенько там покопаться. Итогом может стать например это:
Код:
function GetLine(hwnd: Cardinal; Index: Integer): String; Замечу, что TMemo относится к "классу" (точнее, типу) EDIT |
Savant
Я немного недопонял насчёт параметра Index, который мы передаём процедуре AddToLine, т.е. откуда мы его возьмём...или... :huh: |
Мде, заклинило меня на этом Append , с StrCat чего-то попутал :rolleyes: (подумал, что надо добавить одну строку в конец другой, а не новую строку в Memo :shuffle: ). Второе намного проще:
Код:
procedure AppendLine(hwnd: Cardinal; const S: String); |
Savant
Спасибо,вот теперь всё получилось :) . |
Вот возникла у меня тупиковая ситуация:
Код:
var mov al, [edx+01] ; в EDX располагается массив ...т.е. пересылается только один байт вместо четырёх.Приходится уже вручную править это место на: mov eax, [edx+01] Подскажите пожалуйста,где я туплю и как заставить компилятор пересылать в данном случае двойное слово,а не один байт. |
вар. 1 (следить за границами!!!)
способ универсальный, когда откуда-то надо достать нужное кол-во байтов с любой позиции Код:
var применительно к динамическим массивам Код:
var |
Savant
Спасибо,что откликнулся и помог :) . Воспользовался первым вариантом - получилось. P.S. Хотел бы уточнить - существуют ли всё-таки какие-то различия между типами DWORD и Cardinal ?? |
DillerInc
Цитата:
32-битное беззнаковое целое, 4 байта в памяти. |
Буду очень признателен тому, кто поможет решить такую задачу : при нахождении на форме кусора без движения 3 секунды - он должен исчезать , если пошевелить мышкой - появлятся ( как это сделано в видеоплеерах , например Light Alloy при просмотре видео на весь экран ) .
|
serg700
Давай пробовать :) . Значит есть такая WinAPI-функция TrackMouseEvent,которая способна следить за состоянием курсора и отправлять соответствующие сообщения.Эти сообщения будут приниматься и обрабатываться с помощью функции WindowProc приложения. Функция TrackMouseEvent принимает в качестве параметра указатель на структуру TRACKMOUSEEVENT,заполняя которую мы указываем особенности слежения за курсором. Итак,нам понадобится создать функцию,обрабатывающую различные сообщения, - WindowProc: Код:
var P.S. Я точно не уверен возможно ли таким образом реализовать функцию WindowProc на чистом Delphi,т.е. с применением всяких там VCL и т.п. Я это делал на примере минимального Delphi-приложения,где используется только WinAPI. P.P.S. Вероятно описанная WindowProc не является полнофункциональной,т.к. я старался объяснить только принцип актуального вопроса. |
DillerInc
Спасибо , попробую ; надеюсь сработает ! ;) |
Время: 10:22. |
Время: 10:22.
© OSzone.net 2001-