Форум » GUI » Проблемы и ограничения обработки события OnSize для объекта Image » Ответить

Проблемы и ограничения обработки события OnSize для объекта Image

SADSTAR2: Проблема всплыла в очередной раз когда делал обработку изменения размеров окна так, чтобы объект Image с открытой картинкой также менял свой размер. Делается это так. Сначала меняется размер фрейма внутри которого показывается картинка. Потом вычисляются новые границы для объекта Image. Затем удаляется существующий объект Image и создается новый с новыми границами. Вроде такой способ показан в одном из примеров. //---------------------------- static function wReSize() local s if wMain.Width<400; wMain.Width:=400; endif if wMain.Height<657; wMain.Height:=657; endif wMain.Frame_13.Height:=wMain.Height-wMain.Frame_13.Row-BottomBorder wMain.Frame_13.Width:=wMain.Width-wMain.Frame_13.Col-RightBorder GetImgZoneSize() IF IsControlDefined( Image_1, wMain) s:=wMain.Image_1.Picture wMain.Image_1.Release //ShowPicture(s) ENDIF return Nil //---------------------------- function GetImgZoneSize() imgCol:=wMain.Frame_13.Col+10 imgWidth:=wMain.Frame_13.Width-20 imgRow:=wMain.Frame_13.Row+20 imgHeight:=wMain.Frame_13.Height-30 return Nil //---------------------------- function ShowPicture(cFile) @ imgRow,imgCol IMAGE Image_1 OF wMain ; PICTURE cFile ; WIDTH imgWidth ; HEIGHT imgHeight return Nil //---------------------------- Однако, как выяснилось, вызов обработчика события OnSize - функции wReSize() - происходит через каждый пиксел изменения размера окна. И здесь происходит какая-то шиза – картинка не видна на экране. Закрыл вызов показа (см.текст), оставил только удаление объекта Image_1. Вызываю показ (создание нового объекта Image_1) отдельным нажатием и вижу, что появившаяся картинка частично перекрыта сверху прамоугольником с границами предыдущего удаленного объекта Image_1. Поэтому в предыдущем варианте – с постоянной перерисовкой вовремя ReSize – картинка была не видна , т.к. перекрывающий ее прямоугольник отличался размерами всего на один пиксел. Причем, если окно с картинкой всплывает из-под окна другого приложения – то картинка видна полностью. А если в minimize и обратно – то частично. Резюме. 1. Вопрос. Что это за шиза? Т.е. почему после удаления остается какой-то объект фонового цвета. И как с этим бороться? 2. Предложение. Вроде бы видел в какой-то системе типа Delphy события типа Befor_Resizing и After_Resizing. Первое событие – когда нажимается кнопка мыши на границе окна и производится вход в режим ReSize. Второе событие – когда отпускается кнопка мыши после ReSize. Удобно было бы иметь их в некоторых случаях. Чтобы не производить масштабных вычислений на каждый пиксел изменения размеров, а запомнить что нужно перед ReSize и пересчитать что нужно один раз после ReSize. 3. Замечание. В очередной раз столкнулся с отставанием в документации. Читаю про объект Image - An image static control can display bitmaps, icons (including animated icons), or enhanced metafiles. Начинаю искать способ показать JPG. А в примерах без всяких изысков в Image загружают и JPG, и GIF, и CUR SadStar

Ответов - 25, стр: 1 2 All

gfilatov: SADSTAR2 пишет: почему после удаления остается какой-то объект фонового цвета. И как с этим бороться? Думаю, так работает Win-обработчик события Paint (подробности см. здесь). Попробуй использовать для обновления картинки метод Refresh, который поддерживается в последней версии библиотеки. function ShowPicture(cFile) @ imgRow,imgCol IMAGE Image_1 OF wMain ; PICTURE cFile ; WIDTH imgWidth ; HEIGHT imgHeight // wMain.Image_1.Refresh // return Nil Замечание по теме. Поскольку изменение размеров картинки в примере требуется только для перерисовки фона окна, рекомендую обратить внимание на команду DEFINE BKGBRUSH, которая лучше справляется с этой задачей SADSTAR2 пишет: столкнулся с отставанием в документации Есть такое дело Спасибо за подсказку

Петр: SADSTAR2 пишет: 2. Предложение. Вроде бы видел в какой-то системе типа Delphy события типа Befor_Resizing и After_Resizing. Первое событие – когда нажимается кнопка мыши на границе окна и производится вход в режим ReSize. Второе событие – когда отпускается кнопка мыши после ReSize. Удобно было бы иметь их в некоторых случаях. Чтобы не производить масштабных вычислений на каждый пиксел изменения размеров, а запомнить что нужно перед ReSize и пересчитать что нужно один раз после ReSize. Весь инструментарий для реализации Вашего предложения в MiniGUI Ex есть - SET EVENTS FUNCTION .. Только Вы им почему-то не пользуетесь. Возможны и другие ухищрения - например в OnSize проверять нажата ли кнопка мыши, но сабклассинг все таки лучше.

Петр: Крайне рекомендую сделать бэкап Открываем \MiniGUI\Include\i_var.ch вносим сл.изменения перед #xtranslate _HMG_ErrorLogFile => _HMG_SYSDATA\[1\] добавляем #define _HMG_SYSDATA_SIZE 412 после #xtranslate _HMG_ActiveControlTrailingFontColor => _HMG_SYSDATA\[410\] добавляем #xtranslate _HMG_aFormEnterSizeMoveProcedure => _HMG_SYSDATA\[411\] #xtranslate _HMG_aFormExitSizeMoveProcedure => _HMG_SYSDATA\[412\] Сохраняем изменения, закрываем файл. Открываем \MiniGUI\Source\h_init.prg вносим сл.изменения Меняем Public _HMG_SYSDATA [ 410 ] на Public _HMG_SYSDATA [ _HMG_SYSDATA_SIZE ] после _HMG_aControlMiscData1 := {} добавляем _HMG_aFormEnterSizeMoveProcedure := {} _HMG_aFormExitSizeMoveProcedure := {} Небольшое лирическое отступление. Посмотрев чуть ниже, мы увидим if ! IsInsertActive() If( IsWinNT(), KeyToggleNT( VK_INSERT ), KeyToggle( VK_INSERT ) ) EndIf А вот, что пишут некоторые пользователи: When starting any EXE from SAMPLES directory built with COMPILE.BAT (with no additional parameters), my EXE starts in the background, sending the INS key to the file manager it was started from (both Total Commander and FAR). Is it common problem? How to start HMG application in the foreground ? Улыбаемся, сохраняем изменения, закрываем файл. Открываем \MiniGUI\Source\h_windows.prg Здесь находится серце MiniGUI - функция Events, IMHO эта функция заслужила свой отдельный файл, h_events.prg, например. Будем добавлять обработку событий WM_ENTERSIZEMOVE и WM_EXITSIZEMOVE Где-то возле обработчика WM_MOVE и по аналогии с ним добавляем *********************************************************************** case WM_ENTERSIZEMOVE *********************************************************************** _ActiveMenu := .F. _HMG_MouseRow := HIWORD(lParam) _HMG_MouseCol := LOWORD(lParam) i := Ascan ( _HMG_aFormhandles , hWnd ) if i > 0 _DoWindowEventProcedure ( _HMG_aFormEnterSizeMoveProcedure , i ) EndIf exit *********************************************************************** case WM_EXITSIZEMOVE *********************************************************************** _ActiveMenu := .F. _HMG_MouseRow := HIWORD(lParam) _HMG_MouseCol := LOWORD(lParam) i := Ascan ( _HMG_aFormhandles , hWnd ) if i > 0 _DoWindowEventProcedure ( _HMG_aFormExitSizeMoveProcedure , i ) EndIf exit Дальше в обработчике WM_DESTROY после _HMG_aFormMoveProcedure := "" добавляем _HMG_aFormEnterSizeMoveProcedure := "" _HMG_aFormExitSizeMoveProcedure := "" Function _DefineWindow Вместо Function _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, nosize, nosysmenu, nocaption, StatusBar, StatusText, InitProcedure, ReleaseProcedure, MouseDragProcedure, SizeProcedure, ClickProcedure, MouseMoveProcedure, aRGB, PaintProcedure, noshow, topmost, main, icon, child, fontname, fontsize, NotifyIconName, NotifyIconTooltip, NotifyIconLeftClick, GotFocus, LostFocus, VirtualHeight, VirtualWidth, scrollleft, scrollright, scrollup, scrolldown, hscrollbox, vscrollbox, helpbutton, MaximizeProcedure, MinimizeProcedure, cursor, NoAutoRelease, InteractiveCloseProcedure, RestoreProcedure, MoveProcedure, mdi ) пишем Function _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, nosize, nosysmenu, nocaption, StatusBar, StatusText, InitProcedure, ReleaseProcedure, MouseDragProcedure, SizeProcedure, ClickProcedure, MouseMoveProcedure, aRGB, PaintProcedure, noshow, topmost, main, icon, child, fontname, fontsize, NotifyIconName, NotifyIconTooltip, NotifyIconLeftClick, GotFocus, LostFocus, VirtualHeight, VirtualWidth, scrollleft, scrollright, scrollup, scrolldown, hscrollbox, vscrollbox, helpbutton, MaximizeProcedure, MinimizeProcedure, cursor, NoAutoRelease, InteractiveCloseProcedure, RestoreProcedure, MoveProcedure, mdi, EnterSizeMoveProcedure, ExitSizeMoveProcedure ) Дальше ищем что-то такое if valtype(MoveProcedure) == "U" MoveProcedure := "" endif не находим ( как. в прочем и для InteractiveCloseProcedure, RestoreProcedure и некоторых др.) Пробуем понять в чем смысл if valtype(PaintProcedure) == "U" PaintProcedure := "" endif и после _HMG_aFormMoveProcedure [k] := MoveProcedure добавляем _HMG_aFormEnterSizeMoveProcedure [k] := EnterSizeMoveProcedure _HMG_aFormExitSizeMoveProcedure [k] := ExitSizeMoveProcedure после aAdd ( _HMG_aFormMoveProcedure , MoveProcedure ) добавляем aAdd ( _HMG_aFormEnterSizeMoveProcedure , EnterSizeMoveProcedure ) aAdd ( _HMG_aFormExitSizeMoveProcedure , ExitSizeMoveProcedure ) Подобные изменения при желании вносим в _DefineModalWindow Теперь правим i_window.ch, i_window_ext.ch : #xcommand DEFINE WINDOW <w> ; AT <row>,<col> ; WIDTH <wi> ; HEIGHT <h> ; .... [ ON ENTERSIZEMOVE <EnterSizeMoveProcedure> ] ; [ ON MOVE <MoveProcedure> ] ; [ ON SIZE <SizeProcedure> ] ; [ ON EXITSIZEMOVE <ExitSizeMoveProcedure> ] ; .... [ <helpbutton: HELPBUTTON> ] ; =>; _DefineWindow ( <"w">, <title>, <col>, <row>, <wi>, <h>, <.nominimize.>, <.nomaximize.>, <.nosize.>, <.nosysmenu.>, <.nocaption.>,.F., '',<{InitProcedure}>, <{ReleaseProcedure}> , <{MouseDragProcedure}>, <{SizeProcedure}> , <{ClickProcedure}> , <{MouseMoveProcedure}>, [<backcolor>] , <{PaintProcedure}> , <.noshow.> , <.topmost.> , <.main.> , <icon> , <.child.> , <FontName> , <FontSize>, <NotifyIcon> , <NotifyIconTooltip> , <{NotifyLeftClick}> , <{GotFocusProcedure}>, <{LostFocusProcedure}> , <vHeight> , <vWidth> , <{scrollleft}> , <{scrollright}> , <{scrollup}> , <{scrolldown}> , <{hScrollBox}> , <{vScrollBox}> , <.helpbutton.> , <{MaximizeProcedure}> , <{MinimizeProcedure}> , <cursor> , <.noautorelease.> , <{interactivecloseprocedure}> , <{RestoreProcedure}> , <{MoveProcedure}> , <.mdi.>, <{EnterSizeMoveProcedure}>, <{ExitSizeMoveProcedure}> ) ;; DECLARE WINDOW <w>


Петр: Пишем маленькую демку и убеждаемся что все более-менее сносно работает. #include "minigui.ch" DECLARE WINDOW test function main() PUBLIC aBeginPos := { 0, 0, 0, 0 } PUBLIC aEndPos := { 0, 0, 0, 0 } DEFINE WINDOW test AT 164 , 292 WIDTH 502 HEIGHT 382 TITLE "test" MAIN; ON ENTERSIZEMOVE OnEnterSizeMove(); ON EXITSIZEMOVE OnExitSizeMove(); END WINDOW Activate Window Test return function OnEnterSizeMove() aBeginPos[1] := test.row aBeginPos[2] := test.col aBeginPos[3] := test.height aBeginPos[4] := test.width test.title := str(test.col) + str(test.row) + str(test.height) + str(test.width) return nil function OnExitSizeMove() aEndPos[1] := test.row aEndPos[2] := test.col aEndPos[3] := test.height aEndPos[4] := test.width test.title := str(test.col) + str(test.row) + str(test.height) + str(test.width) return nil

Петр: Рекомендую также по этому шаблону сделать доступной обработку сообщений WM_MOVING, WM_SIZING, возможно чуть-чуть изменить обработку WM_MOVE, WM_SIZE. Это сделает доступным docking, позволит для окна ввести предложения MINHEIGHT, MAXHEIGHT, MINWIDTH, MAXWIDTH и вплотную приблизит к решению autosize control. Останется строк 40-50 кода написать

gfilatov: Петр пишет: Останется строк 40-50 кода написать Большое спасибо за идею! Вижу, что работа над Personal Edition продвигается неплохо

Петр: gfilatov пишет: Большое спасибо за идею! Спасибо. gfilatov пишет: Вижу, что работа над Personal Edition продвигается неплохо Работаем. И я надеюсь, что все, или почти все, хорошие решения и идеи, которые не выходят рамки концепции MiniGUI - рано или поздно попадут в MiniGUI Ex.

gfilatov: Петр пишет: хорошие решения и идеи, которые не выходят за рамки концепции MiniGUI - рано или поздно попадут в MiniGUI Ex. Без сомнений На том стоим! P.S. Петр! Большая просьба, если есть готовые к опубликованию примеры - присылайте (замучился ожидать...)

SADSTAR2: Правильно ли я понял, что мне самому не надо модернизировать систему т.к. метр GFilatov заинтересовался этой идеей и она будет реализована в следующей версии? Иначе получится разветвление версий, а поддерживать свою ветку я не смогу.

gfilatov: SADSTAR2 пишет: она будет реализована в следующей версии? Если я получу еще хотя бы один голос за необходимость такой модернизации, то она будет выполнена Пока же я еще раз рекомендую обратить внимание на более простое решение Вашей проблемы с помощью команды DEFINE BKGBRUSH newBrush PATTERN IN Form_Main BITMAP smiles.bmp

Петр: gfilatov пишет: Если я получу еще хотя бы один голос за необходимость такой модернизации, то она будет выполнена На этом форуме Похоже, что SADSTAR2у придется долго ждать . SADSTAR2, Вам, что нужно - фон окна или картинка в фрейме? Если фон - то действительно DEFINE BKGBRUSH самое простое и эффективное решение.

gfilatov: Петр пишет: позволит для окна ввести предложения MINHEIGHT, MAXHEIGHT, MINWIDTH, MAXWIDTH Эти свойства окна будут доступны в следующем релизе Ниже тестовый пример для этой фичи: /* * MiniGUI MinMaxSize Demo * (c) 2007 Grigory Filatov <gfilatov@freemail.ru> */ #include "minigui.ch" DECLARE WINDOW Form_1 Function Main DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; TITLE 'Hello World!' ; MAIN ; ON MAXIMIZE Form_1.Center DEFINE BUTTON Button_1 ROW 10 COL 10 CAPTION 'OK' ACTION MsgBox('Hello World!') DEFAULT .T. END BUTTON DEFINE BUTTON Button_2 ROW 40 COL 10 CAPTION 'Cancel' ACTION ThisWindow.Release END BUTTON END WINDOW Form_1.MinWidth := 150 Form_1.MinHeight := 150 Form_1.MaxWidth := 1024 Form_1.MaxHeight := 768 CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return nil

Петр: gfilatov пишет: Эти свойства окна будут доступны в следующем релизе Это было бы не плохо. Но мне кажется, что DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; MINWIDTH 150; MAXWIDTH 1024; MINHEIGHT 150; MAXHEIGHT 1024; TITLE 'Hello World!' ; MAIN ; ON MAXIMIZE Form_1.Center тоже нужно предусмотреть. Это облегчит работу Формигони А теперь о примере. Теперь в поставку входит около 300. Причем не буду говорить о их качестве. Давайте о количестве, чтобы просто на них глянуть, затратив 1 минуту понадобится около 5 часов. Я не думаю, что многие согласятся на такой подвиг. И вопросы задаваемые пользователями говорят, что большинство из них примеры не смотрит. Вот лично я бы хотел хотел увидеть вместо ON_INTERACTIVECLOSE, ON_KEY, MoveWindows, ON_QWERYDATA может что-то упустил - один, ну два, хорошо написанных примера по работе с окнами. IMHO примеров в MiniGUI уже столько, что они из "+" превращаются в "-" библиотеки. Ну все сказанное не значит, что я примеров Вам присылать не буду . Но, Григорий, согласитесь пора устроить небольшую уборку

gfilatov: Петр пишет: согласитесь пора устроить небольшую уборку Согласен Давайте конкретные предложения, что выбросить или чем заменить Возможно, требуется добавить еще каталоги для сегментации примеров.. Петр пишет: не значит, что я примеров Вам присылать не буду Ловлю на слове Петр пишет: вопросы задаваемые пользователями говорят, что большинство из них примеры не смотрит. Да, это правда.

gfilatov: Петр пишет: Но мне кажется, что DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; MINWIDTH 150; MAXWIDTH 1024; MINHEIGHT 150; MAXHEIGHT 1024; TITLE 'Hello World!' ; MAIN ; ON MAXIMIZE Form_1.Center тоже нужно предусмотреть Не хотелось бы плодить необязательные свойства в структуре окна Тем более, что можно использовать для присвоения событие ON INIT: DEFINE WINDOW Form_1 ; ... ON INIT oninit() ; ... proc oninit This.MinWidth := 100 This.MinHeight := 150 ThisWindow.MaxWidth := 800 ThisWindow.MaxHeight := 600 return

SADSTAR2: Петр пишет: SADSTAR2, Вам, что нужно - фон окна или картинка в фрейме? Если фон - то действительно DEFINE BKGBRUSH самое простое и эффективное решение. Картинку в заданных границах. Фрейм - рамка для обозначения зоны показа. Кроме этого есть другие визуальные элементы = кнопки,тектбоксы, лейблы и т.п.

SADSTAR2: Петр пишет: SADSTAR2, Вам, что нужно - фон окна или картинка в фрейме? Если фон - то действительно DEFINE BKGBRUSH самое простое и эффективное решение. Картинку в заданных границах. Фрейм - рамка для обозначения зоны показа. Кроме этого есть другие визуальные элементы = кнопки,тектбоксы, лейблы и т.п.

gfilatov: Петр пишет: Но мне кажется, что DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; MINWIDTH 150; MAXWIDTH 1024; MINHEIGHT 150; MAXHEIGHT 1024; TITLE 'Hello World!' ; MAIN ; ON MAXIMIZE Form_1.Center тоже нужно предусмотреть. Согласен с Вами. Добавил эту возможность.

Петр: gfilatov пишет: Добавил эту возможность. Хорошо Сегодня слишком занят. Завтра или послезавтра напишу Вам письмо с некоторыми предложениями и примером с TN. SADSTAR2 Я Вам обязательно отвечу. Посмотрю как организована работа с IMAGE и что-там можно, нельзя исправить.

gfilatov: Петр пишет: напишу Вам письмо с некоторыми предложениями и примером с TN Увы, ничего не получил

SADSTAR2: gfilatov пишет: Попробуй использовать для обновления картинки метод Refresh, который поддерживается в последней версии библиотеки. Это помогло. Картинку видно всегда. По документации опять нестыковку нашел вроде бы. В (x)harbour.chm из поставки нашел функцию FileCopy FILECOPY(<cSourceFile>, <cTargetFile>, [<lMode>]) --> nCopyByte Скомпилировал без ошибок. При выполнении вылетает по ошибке на этой функции, хотя файл скопировался. Смотрю внимательно документацию. Вижу - Library is ct3.lib У меня такой библиотеки нет, а компилятор не ругался. Зато есть libct.lib. Вроде это тоже Clipper Tools. Может в ней есть эта функция, только с другими параметрами? Конечно обошелся без использования этих функций (FileCopy,FileMove), "Осадок остался".

gfilatov: SADSTAR2 пишет: Зато есть libct.lib. Вроде это тоже Clipper Tools. Может в ней есть эта функция, только с другими параметрами? Да, есть. Ниже ее полные исходники: /* * Harbour Project source code: * CT3 file functions: * FILECOPY(), FILECOPEN(), FILECCLOSE(), FILEAPPEND() * * Program..: fcopy.prg * Author...: Frederic J. Bell * Dated....: Jun,17 94 * Revised..: Sep,20 94 * Purpose..: Replaces the following ca-tools functions which generate GPF's * FileCopy(), FileCOpen() & FileAppend()! * Relies on: Clipper (can you believe it!) * Compile..: /n /m /w /[/p /b /l] /es2 * Notes....: * No copyright - released into the public domain NSA. * * Copyright 2007 Przemyslaw Czerpak <druzus / at / priv.onet.pl> * * added FILECDATI() and rewritten above functions for CT3 compatibility * and some problems fixing, * * www - http://www.harbour-project.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). * * As a special exception, the Harbour Project gives permission for * additional uses of the text contained in its release of Harbour. * * The exception is that, if you link the Harbour libraries with other * files to produce an executable, this does not by itself cause the * resulting executable to be covered by the GNU General Public License. * Your use of that executable is in no way restricted on account of * linking the Harbour library code into it. * * This exception does not however invalidate any other reasons why * the executable file might be covered by the GNU General Public License. * * This exception applies only to the code released by the Harbour * Project under the name Harbour. If you copy code from other * Harbour Project or Free Software Foundation releases into a copy of * Harbour, as the General Public License permits, the exception does * not apply to the code that you add in this way. To avoid misleading * anyone as to the status of such modified files, you must delete * this exception notice from them. * * If you write modifications of your own for Harbour, it is your choice * whether to permit this exception to apply to your modifications. * If you do not wish that, delete this exception notice. * */ #include "fileio.ch" #include "common.ch" #define F_BLOCK 512 STATIC s_hSrcFile := -1 STATIC s_lSetDaTi := .T. STATIC s_fileDate, s_fileTime /* * FileCopy() * This is a replacement for the CA-tools III function of the * same name that causes GPF's. */ FUNCTION FILECOPY( cSource, cDest, lMode ) LOCAL hDstFile LOCAL cBuffer := SPACE( F_BLOCK ) LOCAL lDone := .F. LOCAL nSrcBytes, nDstBytes, nTotBytes := 0 IF !ISLOGICAL( lMode ) lMode := .F. ENDIF IF s_hSrcFile != -1 FCLOSE( s_hSrcFile ) ENDIF s_hSrcFile := FOPEN( cSource, FO_READ ) IF s_hSrcFile != -1 hDstFile := FCREATE( cDest ) IF hDstFile != -1 DO WHILE !lDone nSrcBytes := FREAD( s_hSrcFile, @cBuffer, F_BLOCK ) IF nSrcBytes == 0 lDone := 0 EXIT ENDIF nDstBytes := FWRITE( hDstFile, cBuffer, nSrcBytes ) IF nDstBytes > 0 nTotBytes += nDstBytes ENDIF IF nDstBytes < nSrcBytes EXIT ENDIF ENDDO FCLOSE( hDstFile ) IF lDone .OR. !lMode FCLOSE( s_hSrcFile ) s_hSrcFile := -1 ENDIF s_fileDate := FILEDATE( cSource ) s_fileTime := FILETIME( cSource ) IF s_lSetDaTi SETFDATI( cDest, s_fileDate, s_fileTime ) ENDIF ELSE FCLOSE( s_hSrcFile ) s_hSrcFile := -1 ENDIF ENDIF RETURN nTotBytes FUNCTION FILECOPEN() RETURN s_hSrcFile != -1 FUNCTION FILECDATI( lNewMode ) LOCAL lOldMode := s_lSetDaTi IF ISLOGICAL( lNewMode ) s_lSetDaTi := lNewMode ENDIF RETURN lOldMode FUNCTION FILECCONT( cDest ) LOCAL hDstFile LOCAL cBuffer := SPACE( F_BLOCK ) LOCAL lDone := .F. LOCAL nSrcBytes, nDstBytes, nTotBytes := 0 IF s_hSrcFile != -1 hDstFile := FCREATE( cDest ) IF hDstFile != -1 DO WHILE !lDone nSrcBytes := FREAD( s_hSrcFile, @cBuffer, F_BLOCK ) IF nSrcBytes == 0 lDone := 0 EXIT ENDIF nDstBytes := FWRITE( hDstFile, cBuffer, nSrcBytes ) IF nDstBytes > 0 nTotBytes += nDstBytes ENDIF IF nDstBytes < nSrcBytes EXIT ENDIF ENDDO FCLOSE( hDstFile ) IF lDone FCLOSE( s_hSrcFile ) s_hSrcFile := -1 ENDIF IF s_lSetDaTi SETFDATI( cDest, s_fileDate, s_fileTime ) ENDIF ENDIF ENDIF RETURN nTotBytes FUNCTION FILECCLOSE() IF s_hSrcFile != -1 FCLOSE( s_hSrcFile ) s_hSrcFile := -1 RETURN .T. ENDIF RETURN .F. FUNCTION FILEAPPEND( cSrc, cDest ) LOCAL cBuffer := Space( F_BLOCK ) LOCAL hSrcFile, hDstFile LOCAL nSrcBytes, nDstBytes, nTotBytes := 0 hSrcFile := FOPEN( cSrc, FO_READ ) IF hSrcFile != -1 IF !FILE( cDest ) hDstFile := FCREATE( cDest ) ELSE hDstFile := FOPEN( cDest, FO_WRITE ) FSEEK( hDstFile, 0, FS_END ) ENDIF IF hDstFile != -1 DO WHILE .T. nSrcBytes := FREAD( hSrcFile, @cBuffer, F_BLOCK ) IF nSrcBytes == 0 EXIT ENDIF nDstBytes := FWRITE( hDstFile, cBuffer, nSrcBytes ) IF nDstBytes < nSrcBytes EXIT ENDIF nTotBytes += nDstBytes ENDDO FCLOSE( hDstFile ) ENDIF FCLOSE( hSrcFile ) ENDIF RETURN nTotBytes

spair2k: Подскажите пожалуйста, как мне правильнее всего узнать какой видимый размер окна? Я полагаю так, если объекту на форме установить .Col := 0 и сделать .Width := Form1.Width, правая граница объекта будет шире рабочей области окна. Таким образом выяснил, что размер окна это ширина - размер обрамления * 2. Ладно, это все нормально, так типа и должно быть, просто минусуй 8 пикселов и все дела, но если пользователь стиль окна меняет, размер обрамления? Как определить размер обрамления в окне?... Не помню точно, в C++Builder или Delphi есть параметр окна InnerWidth | InnerHeight. Может я не внимательно доку листал? Подскажите пожалуйста. Спасибо...

gfilatov: spair2k пишет: размер окна это ширина - размер обрамления * 2 размер обрамления := GetBorderWidth() Можно установить размер окна как необходимая видимая ширина + размер обрамления

Vlad04: Больше примеров с использоанием IDE. Только Это направление может быть перспективным !!!



полная версия страницы