Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
В VCL объект TBitmap занимается хранением данных и тесно повязан на TIcon и TImageList. В случае с TIcon нужно рисовать транспаренту, а в случае с TImageList нужно уметь компоновать разные катинки в одну. Так что Pixels[] лучше использовать только для транспарента, есть же много Draw-ов. WM_CONTEXTMENU по идее должен соответствовать OnContextMenu любого TControl, опять же апи может непонимать контролов.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 07:57 04-12-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988

Цитата:
Только есть вопросик. Почему не работают пункты системного контекстного меню - WM_CONTEXTMENU? Эм, без понятия если честно. False возвращаю, а толку... и еще одна особенность.

попробуй системное меню через TrackPopupMenu вызывать. Я просто не помню, чтобы у меня такая проблема была с системным меню.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:36 04-12-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Дык я на чистом Апи делаю прогамму, мне эти ТБитмап не нужны. Мне б только знать как перевести некоторый код с этого дурацкого VCL. Вот например самое простое - Image.Width это можно через GetObject у загруженной картинки узнать, а Image.Canvas.Pixels[0, 0] я подумал что это в Апи GetPixel(MskBmpDC,0, y) куда предварительно поместил битмап через SelectObject. так вроде смотрю считай одно и тоже.
 
ShIvADeSt
Так я вызываю через ТрекПопапМеню.
 

Код:
hSysMenu := GetSystemMenu(hApp, FALSE);
//
    WM_CONTEXTMENU:
      begin
        GetCursorPos(lpPoint);
        GetWindowRect(hApp, lpRect);
        lpRect.Bottom := lpRect.Top + 18;
        //ClientToScreen(hApp, lpPoint);
        if PtInRect(lpRect, lpPoint) then
          begin
            SetForegroundWindow(hApp);
            TrackPopupMenu(hSysMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON, lpPoint.X, lpPoint.Y, 0, hApp, nil);
            PostMessage(hApp, WM_NULL, 0, 0);
            //Result := 1;
          end;
        Result := 1;
      end;

 
Не работает код.
 
Ну и переделал ваш код:

Код:
procedure BitmapToRegion(hButton: Thandle; szPathFile: WideString);
var
     x,y,StartLineX             :integer;
     FullRegion,LineRegion      :HRGN;
     TransparentColor           :COLORREF;  
     InFirstRegion,_InLine      :Boolean;  
     PicWidth,PicHeight         :integer;
     DC:HDC;
     Bitmap:HBITMAP;
     BmpInfo : TBitmapInfo;
begin  
  Bitmap := LoadImageW(hInstance, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  GetObject(Bitmap, SizeOf(BmpInfo), @BmpInfo);
  DC := CreateCompatibleDC(0);
  SelectObject(DC, Bitmap);
     PicWidth:=BmpInfo.bmiHeader.biWidth;
     PicHeight:=BmpInfo.bmiHeader.biHeight;
     InFirstRegion:=True;  
     _InLine:=False;  
     StartLineX:=0;  
     TransparentColor:=GetPixel(DC,0,0);
     for Y:=0 to PicHeight-1 do  
        for X:=0 to PicWidth-1 do  
            if (GetPixel(DC, X, Y)=TransparentColor)then begin
                if _InLine then begin  
                    _InLine:=False;
                    LineRegion:=CreateRectRgn(StartLineX,Y,X,Y+1);
                    if InFirstRegion then begin  
                        FullRegion:=LineRegion;  
                        InFirstRegion:=False;  
                       end  
                      else begin
                        CombineRgn(FullRegion, FullRegion, LineRegion, RGN_OR);
                        DeleteObject(LineRegion);  
                       end;  
                   end
               end  
           else  
                If NOT _InLine then begin
                    _InLine:=True;  
                    StartLineX:=X;
                   end;  
SetWindowRgn(hButton, FullRegion, TRUE);
DeleteObject(FullRegion);
  DeleteObject(Bitmap);
  DeleteDC(DC);
end;

Вроде бы работает. Ммм, все ли потом корректно удаляется после создания? Немного смущает как-то что Делфи пишет что FullRegion не инициализирован будет.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 15:12 04-12-2008 | Исправлено: Maks150988, 16:17 04-12-2008
AlexIntegral



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста с задачкой, она не сложная, но я затрудняюсь решить её. Она с использованием оператора if  
 

Код:
Составьте программу вычисления числа дней в месяце. Даны: номер месяца – целое число от 1 до 12, признак високосного года – целое число, равное 1 для високосного года и 0 в противном случае (признак високосного года – номер високосного года делится на 4 нацело).

Всего записей: 245 | Зарегистр. 31-05-2008 | Отправлено: 21:28 04-12-2008
Yozj



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexIntegral
Модератор поправит, но тебе похоже в ветку с паскалем.
А по существу - на каком языке надо писать, Delphi или Turbo Pascal?

Всего записей: 125 | Зарегистр. 01-12-2004 | Отправлено: 21:34 04-12-2008 | Исправлено: Yozj, 21:35 04-12-2008
AlexIntegral



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На Delphi, передо мной среда разработки Delphi 7, а в мысли на счёт задачи никакой. Помогите кто чем

Всего записей: 245 | Зарегистр. 31-05-2008 | Отправлено: 22:05 04-12-2008
Yozj



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexIntegral
А что в лекциях пишут?
Если с IF, то простейший вариант:
Положи на форму TEdit, TLabel, TButton, TCheckBox.
Щелкни два раза на Button и напиши там код:

Код:
 
if Edit1.Text = '1' then
  Label1.Caption := '31'
else if (Edit1.Text = '2') and (CheckBox1.Checked) then
  Label1.Caption := '29'
else if (Edit1.Text = '2') and (not CheckBox1.Checked) then
  Label1.Caption := '28'
else if Edit1.Text = '3' then
  Label1.Caption := '31'
else if Edit1.Text = '4' then
  Label1.Caption := '30'
else if Edit1.Text = '5' then
  Label1.Caption := '31'
else if Edit1.Text = '6' then
  Label1.Caption := '30'
else if Edit1.Text = '7' then
  Label1.Caption := '31'
else if Edit1.Text = '8' then
  Label1.Caption := '31'
else if Edit1.Text = '9' then
  Label1.Caption := '30'
else if Edit1.Text = '10' then
  Label1.Caption := '31'
else if Edit1.Text = '11' then
  Label1.Caption := '30'
else if Edit1.Text = '12' then
  Label1.Caption := '31'
 

Всего записей: 125 | Зарегистр. 01-12-2004 | Отправлено: 22:19 04-12-2008
dscp50

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в одном окне необходимо реализовать копирование файлов, по идее все просто, но в delphi я вообще не силен, последнее что писал - лицейские математические задачки, и никаких знаний функций взаимодействия с файлами и папками не знаю =(
 
в общем нужно что-то типа этого, подскажите, пожалуйста, у кого какие есть догадки по этому поводу,
попытаюсь доработать сам, въезжаю быстро))
 
http://img355.imageshack.us/img355/1944/79633088lt8.jpg
 
+на скрин еще кнопочку "copy" ))

Всего записей: 19 | Зарегистр. 29-11-2008 | Отправлено: 23:17 04-12-2008 | Исправлено: dscp50, 23:18 04-12-2008
Yozj



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dscp50
Ищи в сторону FindFirst, FindNext, посмотри Help по этому делу, там же стандартные функции копирования.

Всего записей: 125 | Зарегистр. 01-12-2004 | Отправлено: 23:25 04-12-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988

Цитата:
Так я вызываю через ТрекПопапМеню.

Погуглил - проблема не нова, вот один из вариантов решения

Код:
 
    WM_CONTEXTMENU:
      begin
        hMenu := GetSystemMenu(hWnd, False);
        SetMenuDefaultItem(hMenu,SC_CLOSE,0);
        GetCursorPos(Cur);
        GetWindowRect(hWnd, Rect);
        Rect.Bottom := Rect.Top + 22;
        if PtInRect(Rect, Cur) then
          begin
            SetForegroundWindow(hWnd);
            hMenuItem:=LongWord(TrackPopupMenu(hMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RETURNCMD , Cur.X, Cur.Y, 0, hWnd, nil));
            if hMenuItem > 0 then
                SendMessage(hWnd, WM_SYSCOMMAND, hMenuItem, 0);
            PostMessage(hWnd, WM_NULL, 0, 0);
          end;
        Result := True;
      end;
 



----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:33 05-12-2008
samusev



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Переклинило..
 
Требуется разбить огромный текстовый (внимание UTF-8) файл на несколько маленьких.
 
как текстовый посторочно читается в Юникод строку?

Всего записей: 75 | Зарегистр. 03-03-2005 | Отправлено: 16:53 05-12-2008
Yozj



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
samusev
Либо используй готовые библиотеки, либо напиши свой класс, скрывающий работу с юникодом.

Всего записей: 125 | Зарегистр. 01-12-2004 | Отправлено: 20:12 05-12-2008
RSoFT1978

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
samusev
Если это текстовый файл (.TXT), то кодировка значения не имеет. Объявляй файловую переменную F типа text, строку s и читай файл построчно  
repeat
readln(F,s);
...
until eof(F);
 
Если нужно изменить кодировку, то используй функцию Utf8ToAnsi(s);

Всего записей: 34 | Зарегистр. 19-05-2007 | Отправлено: 21:30 05-12-2008 | Исправлено: RSoFT1978, 21:31 05-12-2008
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
только s как : WideString; т.к. string не во всех версиях двухбайтная дефолтом...

Всего записей: 24842 | Зарегистр. 06-12-2002 | Отправлено: 22:13 05-12-2008
Yozj



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
+1 Если это будет обычный string, то попавшийся символ нуля всё тебе испортит, а такой символ будет попадаться (в зависимости от текста) через раз.  

Всего записей: 125 | Зарегистр. 01-12-2004 | Отправлено: 22:34 05-12-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, посоветуйте софтину для подсчета строк написанного кода. В смысле, во всех pas-файлах проекта.
 
Добавлено:
И еще такой вопрос: можно ли как-то в программе определить версию, т.е. ту инфу, которая пишется в свойствах проекта: мажор, минор, релиз, билд?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 23:04 05-12-2008
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz

Цитата:
И еще такой вопрос: можно ли как-то в программе определить версию, т.е. ту инфу, которая пишется в свойствах проекта: мажор, минор, релиз, билд?

function GetFileVersion(aFileName: String): String;
var
  L, Linf: Cardinal;
  S: PAnsiChar;
  P, Pinf: Pointer;
  V: String;
begin
  S := PAnsiChar(aFileName);
  L := GetFileVersionInfoSize(S, Linf);
  GetMem(P, L);
  if not GetFileVersionInfo(S, 0, L, P) then begin
    L := GetLastError;
    Result := '?';
  end
  else if not VerQueryValue(P, '\', Pinf, Linf) then begin
    L := GetLastError;
    Result := '?';
  end
  else begin
    Result :=
      IntToStr(HiWord(PVSFixedFileInfo(Pinf).dwFileVersionMS))+'.'+
      IntToStr(LoWord(PVSFixedFileInfo(Pinf).dwFileVersionMS))+'.'+
      IntToStr(HiWord(PVSFixedFileInfo(Pinf).dwFileVersionLS))+'.'+
      IntToStr(LoWord(PVSFixedFileInfo(Pinf).dwFileVersionLS));
  end;
  FreeMem(P);
end;

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 00:26 06-12-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Спасибо, работает. А вы не подскажете способ как нормально закруглить окно кнопки? А то хоть и овнердрав, но она "остроугольная". Или может сабкласс статика на WM_MOUSEMOVE? Но он не работает...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 01:06 06-12-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988

Цитата:
Спасибо, работает. А вы не подскажете способ как нормально закруглить окно кнопки? А то хоть и овнердрав, но она "остроугольная".

Что имеешь ввиду под закруглить. Или ты про поведение, что если нажать на кнопку за пределами рисунка но в границах реальной кнопки, то она все равно нажмется?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:55 06-12-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Ну то есть имеется 32-битная картинка, где есть альфа канал еще, а может мы имеем такую же иконку. Рисунок на ней круглый, а все остальное прозрачно. Например можно создать ImageList из 4 картинок в одной для 4 состояний кнопки. А уже изображения для кнопки из него вытягивать через функцию ImageList_GetIcon и потом через DrawIconEx отображать. Проблема то в том что если уже натянут на диалог рисунок, а тут мы отображаем иконку из списка изображений - видно "квадрат" кнопки. Это ж получается само окно то кнопки не закруглено опять же. Хотел попробовать через овнердрав статика, но там не приходят ODS сообщения в дравитеме и через трекмаусевент тоже не получилось (а может я опять что-то напутал в спешке когджа код переделывал).
Мне видится такой вариант - просчитывать координаты на основном диалоге и через PtInRect проверять их и уже просто в WM_PAINT после накладывания основго рисунка для диалога выводить значок нужный через DrawIconEx. нО это конечно мудрено все, нет ли варианта попроще?
 
 
Сделал со стактиком такой код, проверил чтоб было ODT_STATIC в WM_DRAWITEM. Блин, такое ощущение что не изменяется толком сообщение ODT для контрола. Или этот ODS_SELECTED не работает в статике системном... И ведь пробовал еще сабклассингом делать булевую переменную подставлять и вслучае изменения подставлять в DrawIconEx нужный значок, но ничего не менялось, решил поэтому опробовать на DrawTextW. То же самое. Где ошибка, не подскажете?
 
>>>

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 09:36 06-12-2008 | Исправлено: Maks150988, 13:05 06-12-2008
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru