-Метка 'До окончания осталось ....' в вашем приложении. -Как отсортировать последовательный список в базе данных / Как вставить запись в середину списка. -Размещение данных в EXE. -Как узнать IP адрес. -Как отображать ComboBox в текущей позиции курсора TMemo. -Нужно написать прогу для электронной бегущей строки. -Преобразование ICO в BMP. -Работа с массивами в Delphi. -Работа с Excel. -Как узнать имя объекта, вызвавшего событие ? Нередко один и тот же обработчик применяется для реакции на события различных компонентов. -Как при завершении работы приложения вернуть код. Иными словами - код возврата из функции WinMain. -Выделение строки в DbGrid при нажатии Shift. -Как загрузить в StringGrid графический файл? -О вреде глобальных переменных сказано много, одна из распространнех проблем, из за которой часто возникают ошибки, это переменные форм. -Текстовая печать из программы на Delphi (копия TMemo). -Как найти далее при помощи pos? (аналог найти далее в блокноте windows-а)? -Подсветка синтаксиса. -Подсветить HTML теги в RichEdit. -Как в Excel из Delphi записать макрос. -Как использовать TAPI для голосового звонка? -Как поместить курсор в определенную позицию editа и подобных ему элементов управления? -Как найти все компьютеры в рабочей группе? -Сканирование доменов. -Получить список пользователей, подключенных к сети. -Преобразование IPAddres(LongInt) в привычное xxx.xxx.xxx.xxx. -Как получить список файлов со всеми подкаталогами. -Получаем характеристики экрана через объект Screen. -Алгоритм распознования кодировки. -Эти программы создают горизонтальную полосу прокрутки в ListBox так, что бы все строки компонента умещались. -Включение и выключение устройств ввода/вывода из программы на Delphi. -DBGrid и Memo-поля. -Как вставить содержимое файла в текущую позицию курсора в компонете TMemo? -Любую кодировку выяснить так просто нельзя.
-Принцип смены кодировок (Ansi<>OEM). А как можно определить кодировку у текста? (программно). -что мне не нравится в Richedit - это то, что он сам меняет язык при перемещении по тексту, не смотря, что вы включили нужный язык, при переходе на участок текста, набраный другим языком. -Как распечатать Word'овский файлик не открывая Word? -Необходимо подсчитать кол-во карточек для каждого департамента. Как это сделать пошустрее. -Поиск подстроки в строке с помощью хеш-функции. -Помогите с функцией определения даты начала недели. -Меня интересует возможность подсчета суммы по таблицам, которые уже находятся на форме. -А как сохранить изображение в файле весте с лэйблами? -INI-файлы (чтение/запись). -Добавление строки к файлу. -Работа с кодовыми страницами. -Автоопределение кодировки ANSI/OEM. -Корректно определить версию Windows. -Определить, над какой буквой стоит указатель мыши в TRichEdit. -Позиция курсора в TMemo, TRichedit. -Перекодировка текста из Win кодировки в КОИ-8 и обратно. -Сохранение текста RichEdit в базе данных. -Можно-ли получить номер верхней видимой строки в TMemo? -Как сделать окошко подсказки в редакторе как дельфи по CTRL-J? -функция замены символов в строке. -Исправление загрузки текста RTF через поток Delphi 3. -Чтение текста RichEdit из базы данных. -На уровне формы клавиша tab обычно обрабатывается Windows. -Работа с Word через OLE Я думаю, пример красноречивее пяти листов словоблудия.
Delphi и ресурсы компьютера.
-Исключение неправильных адресов E-Mail. -Работа с принтером. -Можно-ли получить номер верхней видимой строки в TMemo? -Как узнать, какой из стилей оформления используется на машине? -Получение списка окон. -Получение списка процессов. -Как можно удалить все подкаталоги (с файлами) внутри заданного каталога. -Не могу понять как юзать TThread. -SQL. Можно ли в запросе вычислить сумму значений в столбце. -Затенить кнопку закрыть в заголовке формы. -Переход к концу TRichEdit. -Как получить доступ к иконкам десктопа? -Можно ли динамически менять какая форма считается главной в приложении во время работы программы? -Посчитать строку с формулой. -Как узнать автора документа word ? -Как опеделить состояние списка ComboBox, выпал/скрыт? -Привести к верхнему регистру некоторые поля строчного типа встроенными средствами самого Акцесса. -Быстрый способ поиска строки в текстовом файле. -Как получить информацию о БИОСе? -как вытащить или изменить дату и время создания, изменения, открытия файла.
-Как узнать IP адрес. -Как скопировать директорию. -Перевести DBgrid в реим редактирования и установить курсор в окошке редактирования в требуемую позицию? -Как вывести список файлов с иконками. -Как сохранить результат запроса в DBF. -Как получить серийный номер жесткого диска. -Как вывести список файлов, как в Проводнике. -Как считать сигнал с микрофона. -Как сделать DLL и потом из него каpтинки гpузить. -Дескриптор окна. -Как на форме отобразить array[1..10,1..10]. -Как в консольном приложении можно задать цвет текста, вывести текст. -Как можно сделать ссылку на почтовый адрес? -Как хранить настройки для программы?
-Подcкажите где взять компонент Grid с возможностью объединять несколько ячеек в одну, как в Exel. -Когда я добавляю обьект в список TStrings как мне его потом уничтожить? -Добавление программы в автозапуск. -Как создать отдельную подсказку (hint) для каждой ячейки StringGrid? -Доступ объекту Oracle: -Электронное письмо или запустить Интернет-Браузер по 'клику' на определенном 'контроле' информации. -Как использовать свои курсоры в программе? -Как получить строку сообщения об ошибке Windows код которой получен функцией GetLastError? -Как получить координаты указателя мыши относительно формы в Дельфи? -Удалить каталог со всем содержимым. -Копирование файлов * *. -Как скопировать все файлы вместе с подкаталогами * * -Как написать очень маленький инсталлятор ? -Создать ярлык можно при помощи данной функции: -Оповещение приложения (или всей системы) о изменении WIN.INI. -Как удалить самого себя ? -Добавление программы в автозапуск. -Удаление файла в корзину. -Добавление ссылки на файл в меню Пуск|Документы. -Установка своего WallPaper для рабочего стола Windows. -Как передать при создании нити (Tthread) ей некоторое значение?
-Как сохранять и загружать file of? Напишите PLZ пример. -Есть бинарное дерево в узлах информация, очень большое дерево порядка 1000 узлов. -Вы не могли бы подсказать, ф-цию, которая имитирует нажатие клавиши с клавиатуры. -Как сохранить и прочитать RTF в/из TBlobField. -Записать в BLOB поле большой текст (более 255). -Узнать размер BLOB-поля. -Запись потока в BLOB-поле. -Определение IP-адреса по домену в Delphi. -Файловые операции с использованием стандартного диалога с анимацией. -Как узнать информацию о системе в Delphi. -Ошибка Token not found. Token :dbo. line number:1. -Файловые операции с использованием стандартного диалога с анимацией. -Подпрограммы управления файлами. -В системе помощи Delphi существует понятие - подпрограммы управления файлами (category File management routines). -Объект Screen создается автоматически и доступен любой вашей программе. -Registry - системный реестр, существующий в Windows. -Удаление пробелов в строке. -Необходимо из определенной директории удалить файлы определенных типов. Т.е., например, из c: emp надо удалить все файлы с расширением *.txt. -Устанавливаем свой WallPaper для Windows. -Отображение полных строк списка при перемещении мыши по списку. -Как получить активный URL из браузера. -Стоит задача импорта данных из одного mdb файла в другой. -Нужно в зависимости от длины поля в таблице, которая копируется в Excel, менять column.width в Excel. -Как узнать местонахождение курсора в TMemo или RichEdit. -Жизнь и смерть копмонентов в RunTime. -Сохранение динамического массива в файл.. [D7, WinXP]. -Перенос данных из Excel в Table [D6, Paradox]. -Как скачать любой URL используя стандартные настройки сети. -Помогите с установкой 'fibplus4702'. -несколько полезных функций, для работы с текстом. -Как вставить в StatusPanel свои компоненты, например ProgressBar? -Как зная логин пользователя получить его имя ? -Работаем со строками. -Как запустить компонент панели управления и как открывать некоторые стандартные системные окна. -Поля печати в ReachEdit. -Как установить соединение с интернетом средствами делфи. -Драйвера баз данных (ADO 2.7).
-Нахождение всех компьютеров в рабочей группе. -Кодировка DB. -Подключение сетевого диска. -Возможно ли сжать базу данных MSAccess, как это делает сам MSAcce [D5]. -Можно ли написать триггер, при записи в таблицу записывались бы данные в таблицу Paradox, и еще как записать в таблицу файл? -Спрятать главную форму. -Мне нужна функция перевода цифр в прописные буквы. Пример 123(Сто двадцать три). -Вставка формул через OLE в Excel из Delphi. -Отправка по Socket-у. -Это специально для незарегистрированных DELPHI_UPDATE. -Вызов диалога открытия файла (API). -Сумма Прописью по Владимиру Яркову. -Русские буквы в Database Desktop 7.0 [D6, Paradox]. -ADOConnection.ConnectionString при переносе проги. [D7, Win95/98, WinXP]. -Требуется, что бы при прокрутке DBGrid по горизонтали первый стобец оставался на месте. -Проблема с определением имени драйвера ODBC [D7, dBase, FoxPro]. -Помогите с Socket. -В примере описывается как программно в Internet Explorer нажать кнопку 'Clear cache'. -Смена обоев рабочего стола. WinXP. -Рассмотрим основные свойства и методы класса TString. -Как добавить горизонтальную полосу прокрутки в TListBox? -Иногда всплывающее меню моего приложения system tray не исчезает когда оно теряет фокус. Как закрыть его? -Подскажите, как можно из Delphi вставить в Excel картинку. -Как скопировать директорию. -Как сохранить в текстовый файл все столбцы TListView используя SaveDialog? -Процедура добавляет строку в TStrings, исключяя добавление уже имеющейся строки. -Получение списка запущенных приложений... -Добавление графических файлов в 'тело' программы... -Как экспортировать таблицу базы данных в ASCII-файл...
-Прога ведёт лог. При запуске прога должна найти последнюю строку. -Подскажите как можно рализовать визуальный (что бы отображался отсчет времени) таймер. -Работа с базами данных с помощью DAO. -Обновить DBLookUpComboBox при скролинге таблицы [D5, Paradox]. -Ячейки DBGrid Как сделать чтобы необходимая ячейка получила фокус ввода ? -Форма, демонстрирующая различные методы создания массива с динамически изменяемым размером. -Управление устройствами через порты. -Установка Interbase. -Как могу я получить Дескриптор Процесса с помощью WinAPI, если известно его название? -Работа с треем. -Как могу я получить Дескриптор Процесса с помощью WinAPI, если известно его название? -Работа с реестром в Delphi. -Привлечение внимания к окну (new).
Когда я устанавливаю Active в True, то получаю ошибку: 'Token not found. Token :dbo. line number:1'
У меня есть TQuery и TDataSource. В свойстве SQL для TQuery я пишу SELECT * FROM dbo.AnyTable база данных на MS SQL Server. Когда я устанавливаю Active в True, то получаю ошибку: 'Token not found. Token :dbo. line number:1'. Что не так?
Если свойство RequestLive=True, то имя таблицы нужно брать в кавычки: SELECT * FROM " dbo.table" Если свойство RequestLive=False, кавычек не требуется: SELECT * FROM dbo.table
Обычно компилированный ЕХЕ файл занимает около 400, а как сделать его в маленький размер около 50?
Ответ 1: Можно, но тогда вместе с *.exe Вам придется распространять и библиотеки. Для этого поставьте в опциях проекта галочку на Packages\Build with runtime packages.
Ответ 2: Можно еще задействовать компрессоры: NeoLite (ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip), Petite (http://www.icl.ndirect.co.uk/petite), Shrinker (http://www.blinkinc.com)
Ответ 3: Есть несколько путей: 1) Компиллировать пакеты отдельно, но тогда их прийдется распространять с программой, выгоды не будет 2) Писать только консольные приложения, тогда никаких форм, кнопок и т.п. не будет 3) Писать только на WinAPI - оччччччень трудоемкий процесс - только чтобы показать форму вы напишете строк 100 кода, и так для каждото компонента, и обработчик событий свой писать прийдется и т.п., собственно что бы избавить Вас от этой мороки и был придуман Дельфи 4) Есть несколько сторонних VCL библиотек, меньшего размера, посмотрите на www.torry.net, но прийдется отказаться почти от всех привычных библиотек 5) компрессировать результирующий файл - у меня есть абсолютно беспланый упаковщик, компрессия сопоставима с zip/rar, для конечного пользователя совсем прозрачно. Напишите мне - я вышлю если надо, или положу на свой сайт.
Ответ 4: 1) Сжать его паковщиком, например NeoLite-ом (правда из 400 кил 50 не получится... у меня из 357к осталось 186к... Есть и другие упаковщики, но НеоЛит сжимает сильнее.) 2) Использовать файловые потоки для сбрасывания всех визуальных объектов формы в файл. (Экзешник получается меньше, но появляется дополнительный файл и в результате общий размер не изменяется...)
Передать параметр в уже запущенную программу методом Dragamp Drop?
Как передать параметр в уже запущенную программу методом Dragamp Drop? Например, как сделать, чтобы после перетаскивания файла из Проводника на форму последняя поменяла свой Caption на имя файла?
Ответ 1: Вот это я как-то нашёл на одном из русских FAQов в Internete. Проверено - работает. Этот модуль отображает в ListBoxе имена отбуксированых файлов из проводника на форму
const SC_DragMove=$F012; begin ReleaseCapture; Panel1.Perform(WM_SYSCommand, SC_DragMove, 0); end;
(*procedure TForm1.WMDropFiles(var Msg : TMessage); var i, n : word; Size : Word; FName : String; HDrop : Word;
begin {1. Получить handle того, что бросили на форму} HDrop := Msg.WParam; {2. Сколько файлов брошено?} n := DragQueryFile(HDrop, $FFFF, NIL, 0); ShowMessage(IntToStr(HDROP)); {3. Цикл чтения имен файлов} for i := 0 to (n - 1) do begin
{4. Получить размер имени файла} Size := DragQueryFile(HDrop, i, NIL, 0);
{5. Размер строки lt255 символов?} if Size lt 255 then begin FName[1] := Chr(Size); {6. Получить имя файла} DragQueryFile(HDrop, i, @FName[1], Size + 1); {-- Далее делаете все, что хотите с этим файлом. --}
// Form1.ListBox1.Items.Add(FName); end;
end; {7. Возвращаем ноль.} Msg.Result := 0; {8. Вызов унаследованного обработчика сообщения} inherited; end;*) procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES); var NumFiles : longint; i : longint; buffer : array[0..255] of char; begin {Сколько файдов прибуксовано} NumFiles := DragQueryFile(Message.Drop,$FFFFFFFF,nil,0); {Принимаем брошенные файлы} for i := 0 to (NumFiles - 1) do begin DragQueryFile(Message.Drop,i,@buffer,sizeof(buffer)); Form1.ListBox1.Items.Add(buffer); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Form1.Handle, True); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DragAcceptFiles(Handle, false);
end;
end.
Ответ 2: Для обработки событий Dragamp Drop нужно определить два обработчика событий для формы: OnDragOver и OnDragDrop. Первое событие возникает при протаскивании над формой какого-либо объекта. В параметрах события указывается, кому принадлежит перетаскиваемый объект, т.е. его Источник. При возможности и желании принять этот объект параметру-переменной Accept присваивается значение True.
Второе событие возникает при опускании перетаскиваемого объекта на форму. В нем нужно выполнить все действия по обработке quotброшенного quot объекта. Дополнительную информацию о нем можно получить из параметров события. Более подробно можно посмотреть в хелпе, у меня сейчас под рукой нет исходников с примерами.
procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True); end;
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles); var CFileName: array[0..MAX_PATH] of Char; begin try if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) gt0 then begin Form1.Caption:=CFileName;// Вот тут и оно! Msg.Result := 0; end; finally DragFinish(Msg.Drop); end; end;
Подскажите как работать с модемом под win 2000 написать простейший диалер я с хелпом так и не разобрался
Ответ 1: У меня есть такой пример. Может поможет разобраться.
Как lthttp://delphi.mastak.ru/cgi-bin/faq.pl?look=1amp id=1-959901315 gt определить состояние модема под Win32?
Пример:
Code
procedure TForm1.Button1Click(Sender: TObject); var CommPort : string; hCommFile : THandle; ModemStat : DWord; begin CommPort := 'COM2';
{Open the comm port} hCommFile := CreateFile(PChar(CommPort), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hCommFile = INVALID_HANDLE_VALUE then begin ShowMessage('Unable to open '+ CommPort); exit; end;
{Get the Modem Status} if GetCommModemStatus(hCommFile, ModemStat) lt gt false then begin if ModemStat and MS_CTS_ON lt gt 0 then ShowMessage('The CTS (clear-to-send) is on.'); if ModemStat and MS_DSR_O!
N lt gt 0 then ShowMessage('The DSR (data-set-ready) is on.'); if ModemStat and MS_RING_ON lt gt 0then ShowMessage('The ring indicator is on.'); if ModemStat and MS_RLSD_ON lt gt 0 then ShowMessage('The RLSD (receive-line-signal-detect) is on.'); end;
{Close the comm port} CloseHandle(hCommFile); end;
Ответ 2: А на кой, извиняюсь, чорт тебе понадобился драйвер для модема? .) На самом деле как такового драйвера для модемов под виндой не существует. Есть только *.inf файлы с АТ коммандами для конфигурирования оного девайса. (всякие приблуды для работы с войсовыми функциями модемов я в расчет не беру)
Вот. Если же тебе нужно работать с модемом из под дельфей (ну там написать какой нибуть терминал, звонилку, передачу факсов организовать), то используй AsyncPro.
Ответ 3: Используйте компонент Async Professional. Его можно найти в комплекте Turbo Power. Все для работы с модемом (+факс) и куча различных примеров.
Функция занесения в строковую переменную пути моей программки.
Появилась идея: может есть функция, которая мне укажет и переведет в строковую переменную путь моей программки-меню. Т.е. если она находится на диске F:\, то она она в строковую переменную загонит quotF:\ quot, а если моя программа находиться на C:\TRT\ то напишет quotC:\TRT\ quot.
Ответ 1:
Может вот так :
Code
.... var CurrntDir : String; ..... procedure TTrmnForm.FormCreate(Sender: TObject); begin
GetDir(0,CurrntDir); // Получаем полный путь к *.exe
end; Ответ 2: можно так: sPath := ExtractFilePath(Application.ExeName); //Получаем путь к exe
Скажите пожайлусоздания и форматирования новых параграфов.
Ответ 1: Номера страниц можно добавить положив еещ одну компоненту QRSysData
Ответ 2: Можно сформировать отчет в Word из Delphi, открыть его в Word, а там уж пусть меняют, что хотят. Это делается с помощью компонентов TWordApplication, TWordDocument на панели Servers.
Ответ 3: Есть очень замечательный генератор отчетов - FastReport. Он предназначен для построения отчетов, представляет собой сочетание дизайнера, генератора и Preview отчетов. Здесь вы найдете все что вам необходимо. Компоненты можно посмотреть здесь http://www.fastreport.ru/rus/index.shtml
Ответ 4: gt После недолгого разбирательства внедрил в свою программу quotпредпросмотр quot. gt Однако родился вопрос: я ведь могу с помощью QuickRep1 только смотреть, как gt будет выглядеть страница. А, можно, скажем, во время работы изменить gt значение размеров полей, добавить номера страниц и т.д.? Иначе какой смысл gt использовать предпросмотр?! Можно добавлять динамически объекты в любую форму, и в QuickRep тоже. Или просто заранее выложить туда все заголови, номера страниц и т.д., а в событии OnPrint проверять, нужно ли их печатать (смотря на указания пользователя). gt И еще, там имеются кнопки, подписи (hint) к которым сделаны на английском. gt Могу ли я их quotперевести quot - программа-то моя русская. Да и кнопки save и open gt мне там не очень нужны. Что можете посоветовать? Перевести -- элементарно. Открой .res ResourceWorkshop'ом или чем-то аналогичным и переведи. У меня получалось :). Если не нужны кнопки -- можно отключить и их, но сложнее. Самое простое -- в ресурсном файле сдвинуть координаты этих кнопок за пределы окна. Тогда их не будет видно :) gt Оптимально, мне нужен quotпредпросмотр quot как в любом текстовом редакторе - gt notepad, word. А в чем отличия?
Ответ 5: gtя ведь могу с помощью QuickRep1 только смотреть, как gtбудет выглядеть страница. А, можно, скажем, во время работы изменить gtзначение размеров полей Ну почему же только смотреть...... Например: QRRichText1.Heigth:= QRRichText1.Lines.LoadFromFile() QRImage1.Left:= QRLabel1.Caption:='' и т.д. и т.п.
gt добавить номера страниц и т.д. Можно ли через св-ва самого QuickRep - не знаю , но точно можно поюзать QRSysData : QRSysData1.Data:=qrsPageNumber
gtИ еще, там имеются кнопки, подписи (hint) к которым сделаны на английском. gtМогу ли я их quotперевести quot - программа-то моя русская. Я думаю - это вряд ли... Попробуйте поискать расширенные QR сомпоненты . В RX к сожалению - нету :(
А вообще ежели так хочеться ВСЁ менять в RunTime просто сделайте ваш QR видимым (поместить на видимую форму)..........
Ответ 6: Для создания своего предпросмотра надо использовать не метод Preview, а компонент TQRPreview. А кнопочки и надписи какие-угодно придётся делать самому. Что касается изменения значений размеров полей, добавления номеров страниц и т.д.: просто меняешь то, что надо у QuickReportа
Функция GetKeyState (Win32API) возвращает статус кнопки клавиатуры, переданной ей в качестве параметра. Статус определяет, что кнопка нажата(down), отпущена(up) или переключена(on/off, как например клавиши NumLock или CapsLock). Если старший разряд возвращаемого значения равен 1, то кнопка нажата, иначе она отпущена. Если младший разряд равен 1, то кнопка включена(состояние On), иначе кнопка выключена(off).
SHORT GetKeyState( int nVirtKey );
Например:
IF GetKeyState(VK_NUMLOCK) = 1 Then ...// Кнопка "NumLock" включена (on)
Текст выглядит лучше, если он выровнен по двух краям. Для этого пробелы в каждой строке нужно удлинять или укорачивать так, чтобы все строки имели одну длину. Здесь создана процедура GetLine, которая возвращает одну строку, начиная с заданного символа. Программа находит разницу между шириной текста и реальной длинной строки и при выводе компенсирует эту разницу удлинением пробелов. Эта программа выводит на экран текст из файла C:\text.txt, выравнивая его по двум краям.
Code
type ... TLine = record s: string; wrap: boolean; length: integer; end;
var Form1: TForm1;
implementation
{$R *.DFM}
const FileName = 'C:\text.txt';
var s: string; bm: TBitMap; LineH: integer; MaxTextWidth: integer;
procedure TForm1.FormCreate(Sender: TObject); var F: TFileStream; buf: array [0..127] of char; l: integer; begin ScrollBar1.Kind := sbVertical; bm := TBitMap.Create; with bm.Canvas.Font do begin Name := 'Serif'; Size := 12; end; LineH := bm.Canvas.TextHeight('123');
if not FileExists(FileName) then begin ShowMessage('Can not find file ' + FileName); Exit; end; F := TFileStream.Create(FileName, fmOpenRead); repeat l := F.Read(buf, 128); if l = 128 then s := s + buf else s := s + copy(buf, 1, l); until l < 128; F.Destroy; end;
function RealTextWidth(s: string): integer; var i: integer; begin result := bm.Canvas.TextWidth(s); for i := 1 to Length(s) do if s[i] = #9 then inc(result, 40 - bm.Canvas.TextWidth(#9)); end;
function GetLine(index: integer): TLine; var i: integer; s1: string; first: integer; begin if (s[index] = #13) and (s[index + 1] = #10) then begin result.s := ''; result.length := 2; result.wrap := true; Exit; end; first := index; while (first <= Length(s)) and (s[first] in [#32]) do inc(first); i := first; repeat while (i <= Length(s)) and (not (s[i] in [#9, #32])) and (s[i] <> #13) do inc(i); s1 := copy(s, first, i - index); inc(i); until (i >= Length(s)) or (s[i-1] = #13) or (RealTextWidth(s1) > MaxTextWidth); if RealTextWidth(s1) > MaxTextWidth then begin result.wrap := false; if i < Length(s) then begin dec(i, 2); while (i > 0) and (not (s[i] in [#9, #32])) do dec(i); result.Length := i - index; while (i > 0) and (s[i] in [#9, #32]) do dec(i); end; result.s := copy(s, first, i - index + 1); if result.s[length(result.s)] = #32 then delete(result.s, length(result.s) , 1); end else begin result.length := i - index + 1; s1 := copy(s, first, i - index + 1); if length(s1) > 0 then begin if s1[Length(s1)] = #9 then delete(s1, Length(s1), 1); if s1[length(s1) - 1] + s1[length(s1)] = #13#10 then delete(s1, length(s1) - 1, 2); end; result.s := s1; result.wrap := true; end; end;
procedure draw; var i, j: integer; line: TLine; OneWord: string; LineN: integer; SpaceCount: integer; TextLeft: integer; shift, allshift: integer; d: integer; LineCount: integer; begin with bm.Canvas do begin FillRect(ClipRect); i := 1; LineCount := 0; for j := 1 to Form1.ScrollBar1.Position do begin line := GetLine(i); inc(i, line.length); inc(LineCount); end; LineN := 0; repeat line := GetLine(i); SpaceCount := 0; TextLeft := 0; for j := 1 to Length(line.s) do if line.s[j] = #32 then inc(SpaceCount); if line.wrap = false then allshift := MaxTextWidth - RealTextWidth(line.s) else allshift := 0; if allshift > 40 * SpaceCount then allshift := 0; shift := 0; for j := 1 to Length(line.s) do begin if (not (line.s[j] in [#9, #32])) and (j < Length(line.s)) then begin OneWord := OneWord + line.s[j]; end else begin OneWord := OneWord + line.s[j]; if OneWord = #9 then begin inc(TextLeft, 40); end else begin if OneWord = #13#10 then begin inc(LineN); end else begin TextOut(10 + TextLeft, LineN * LineH, OneWord); if SpaceCount = 0 then d := 0 else d := (allshift - shift) div (SpaceCount); inc(shift, d); inc(TextLeft, TextWidth(OneWord) + d); dec(SpaceCount); end; end; OneWord := ''; end; end; inc(i, line.length); inc(LineN); until (LineN * LineH > Form1.PaintBox1.Heig repeat line := GetLine(i); inc(i, line.length); inc(LineCount); until i >= Length(s); inc(LineCount, LineN); Form1.ScrollBar1.Max := LineCount - Form1.PaintBox1.Height div LineH; end; Form1.PaintBox1.Canvas.Draw(0, 0, bm); end;
procedure TForm1.PaintBox1Paint(Sender: TObject); begin draw; end;
procedure TForm1.ScrollBar1Change(Sender: TObject); begin draw; end;
Этот алгоритм позволяет перекодировать текст. Реализованы кодировки Windows-1251, KOI8-R, ISO-8859-5 и DOS. Кодировка – это таблица, в которой указано, например, что символ под номером 160 - это русская буква "а", а под номером 150 – "Ц" и т. д. Кодировки различаются номерами русских букв (как располагать английские буквы договорились). Разные компьютеры в Интернете используют разные кодировки. И поэтому, когда русский текст идет по Интернету, его многократно перекодируют.
Этот алгоритм обеспечивает высокую скорость перекодирования больших объемов данных.
Code
procedure TForm1.Button1Click(Sender: TObject); var code1, code2: TCode; s: string; c: char; i: integer; chars: array [char] of char; str: array [TCode] of string; begin case ComboBox1.ItemIndex of 1: code1 := koi; 2: code1 := iso; 3: code1 := dos; else code1 := win; end; case ComboBox2.ItemIndex of 1: code2 := koi; 2: code2 := iso; 3: code2 := dos; else code2 := win; end; s := Memo1.Text;