[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Хм, можно на Delphi?)
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    PHP:
    uses windows;

    Function 
    GetConsoleWindowHWNDstdcallexternal 'Kernel32.dll';

    var
    hConsoleWindowHWND;
    wndStyle:DWORD;
    clientRect:TRECT;
    begin
    hConsoleWindow
    :=GetConsoleWindow();
    wndStyle:=GetWindowLong(hConsoleWindowGWL_STYLE);
    wndStyle:=wndStyle or WS_SIZEBOX;
    ShowWindow(hConsoleWindowSW_HIDE);
    SetWindowLong(hConsoleWindowGWL_STYLEwndStyle);
    ShowWindow(hConsoleWindowSW_SHOW);
    ShowScrollBar(hConsoleWindowSB_BOTHfalse);
    GetClientRect(hConsoleWindowclientRect);
    InvalidateRect(hConsoleWindow, @clientRecttrue);
     
    #9662 #colorblind, 21 Oct 2014
    Last edited: 21 Oct 2014
    1 person likes this.
  3. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Не работает ваш код, размеры меняются, полосы прокрутки на месте.
     
  4. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Чтобы полос прокрутки не было, надо размеры буфера экрана консоли правильно задать.

    А вообще, подобные манипуляции не предусмотрены для консольных приложений, и в частности для самого ConHost.

    Читайте матчасть:
    http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682055(v=vs.85).aspx
    http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682073(v=vs.85).aspx
     
    1 person likes this.
  5. Eich3

    Eich3 Member

    Joined:
    27 Jan 2013
    Messages:
    22
    Likes Received:
    7
    Reputations:
    5
    хм, скомпилил у себя, ограничение размеров работает.

    Естественно, данный код ограничивает ресайз посредством передвижения мышью границ окна - но не ограничивает ресайз через окно "Свойства - Расположение".

    должно быть так:

    PHP:
    wndStyle := wndStyle and not WS_SIZEBOX;
    т.е. мы должны оставить все текущие стили, кроме WS_SIZEBOX.

    Насчет скроллинга - у меня отключение через ShowScrollBar срабатывает как-то через раз :) можно задать размер фреймбуфера равным размеру окна примерно так:


    Code:
    var
      // ...
      csbi : CONSOLE_SCREEN_BUFFER_INFO;
      newSizeInfo : COORD;
    begin
      // ...
      GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), @csbi);
      newSizeInfo.X = csbi.srWindow.Right - csbi.srWindow.Left + 1;
      newSizeInfo.Y = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
      if not SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), newSizeInfo) then
      begin
        raise Exception.Create('WinAPI Error ' + IntToStr(GetLastError));
      end;
    end;
    
     
    #9665 Eich3, 22 Oct 2014
    Last edited: 22 Oct 2014
    1 person likes this.
  6. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Спасибо всем, кто принимает участие, уже где-то недалеко от истины) В общем мне нужно задать размеры консольного окна, затем запретить изменение размера и убрать полосы прокрутки. И еще желательно, чтоб окно было в центре экрана. Еще раз всем спасибо за помощь.

    Запрет размера действительно работает, а вот полосы прокрутки все такие же)
     
    #9666 seregahowe, 22 Oct 2014
    Last edited: 22 Oct 2014
  7. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    В общем вроде бы все сработало) Спасибо всем, только когда сворачиваешь, прога исчезает из виду)) В диспетчере приложений отображается)

    Как-то так, это правильно или можно что-то добавить/выкинуть??:

    PHP:
      R.Right := 32;
      
    R.Bottom := 13;   
      
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord1);
      
    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TrueR);
      
    SetConsoleTitle('...');
      
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), csbi);
      
    newSizeInfo.:= csbi.srWindow.Right csbi.srWindow.Left 1;
      
    newSizeInfo.:= csbi.srWindow.Bottom csbi.srWindow.Top 1;
      if 
    not SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), newSizeInfothen
      begin
        raise Exception
    .Create('WinAPI Error ' IntToStr(GetLastError));
      
    end;
      
    hConsoleWindow := GetConsoleWindow();
      
    wndStyle := GetWindowLong(hConsoleWindowGWL_STYLE);
      
    wndStyle := wndStyle and not WS_SIZEBOX;
      
    ShowWindow(hConsoleWindowSW_HIDE);
      
    SetWindowLong(hConsoleWindowGWL_STYLEwndStyle);
      
    ShowWindow(hConsoleWindowSW_SHOW);
      
    ShowScrollBar(hConsoleWindowSB_BOTHfalse);
      
    GetClientRect(hConsoleWindowclientRect);
      
    InvalidateRect(hConsoleWindow, @clientRecttrue);
    И чтоб при запуске была в центре экрана еще нужно)
     
    #9667 seregahowe, 22 Oct 2014
    Last edited: 22 Oct 2014
  8. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Никто не поможет?)

    Еще системную кнопку max_size disable сделать)

    Сократил код до такого:

    PHP:
      R.Right := 32;
      
    R.Bottom := 13;
      
    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TrueR);
      
    SetConsoleTitle('***');
      
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), csbi);
      
    Coord.:= csbi.srWindow.Right csbi.srWindow.Left 1;
      
    Coord.:= csbi.srWindow.Bottom csbi.srWindow.Top 1;
      
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord);
      
    hConsoleWindow := GetConsoleWindow();
      
    wndStyle := GetWindowLong(hConsoleWindowGWL_STYLE);
      
    wndStyle := wndStyle and not WS_SIZEBOX;
      
    SetWindowLong(hConsoleWindowGWL_STYLEwndStyle);
      
    ShowScrollBar(hConsoleWindowSB_BOTHfalse);
    Вроде ничего не ухудшилось. Осталось размещение окна в центре экрана при запуске + disable (системная кнопка "Развернуть во весь экран)

    зы: И не помешал бы запрет выделения мышкой (внутри консольного окна)
     
    #9668 seregahowe, 23 Oct 2014
    Last edited: 24 Oct 2014
  9. cardons

    cardons Elder - Старейшина

    Joined:
    19 Jul 2005
    Messages:
    778
    Likes Received:
    324
    Reputations:
    83
    Есть функция которая ищет на большом изображении другое поменьше. Где buf1, buf2 это массивы в которых вписаны цвета каждого пикселя изображения поочередно. buf2 это искомое изображение. Функция работает замечательно, но ищется всего 1 вхождение изображения. Подскажите как сделать чтобы находило все вхождения, то есть если на большом изображении 3 маленьких искомых чтобы он искал все?

    Code:
    function TForm1.CompareIMG(Source, Find: TBitmap): FRes;
    var
      y, x, yy, xx: integer;
    begin
      y := 0;
      
      repeat
    
        x := 0;
    
        repeat
    
          Result.found := true;
    
          yy := 0;
    
          repeat
    
            xx:=0;
    
            repeat
    
              if buf1[y + yy, x + xx] <> buf2[yy, xx] then Result.found := false;
    
              inc(xx);
            until (xx >= find.Width) or (Not Result.found);
    
            inc(yy);
            
          until (yy >= find.Height) or (Not Result.found);
    
          inc(x);
    
        until (x > source.Width - find.Width) or (Result.found);
    
        inc(y);
        
      until (y > source.Height - find.Height) or (Result.found);
    
      if Result.found then
      begin
    
        Result.x := x-1;
        Result.y := y-1;
        
      end;
      
    end;
    
     
  10. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Ку всем, такой вопрос, пытаюсь портировать с delphi старших версий (7) на delphi2, тут нет поддержки динамических массивов, конкретно интересует array of string возможно как-то реализовать? Спасибо

    При статическом происходит нехилая утечка памяти) Хотя статический массив наверно не выход.

    PHP:
      AssignFile(f'source.txt');
      
    Reset(f);
      while 
    not EOF(f) do
      
    begin
        inc
    (num);
        
    readln(f);
      
    end;
      
    Reset(f);
      
    SetLength(accountssucc(num));
      for 
    := 0 to num do
        
    readln(faccounts[k]);
     
    #9670 seregahowe, 27 Oct 2014
    Last edited: 27 Oct 2014
  11. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    1 person likes this.
  12. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Если не трудно, можешь переписать в контексте моего кода?) Спасибо
     
  13. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Будьте любезны, подскажите, создал некое количество потоков, они выполняются, пока не будет достигнуто конкретное решение, потоки созданы через BeginThread, вопрос: Как узнать количество работающих в данный момент потоков?
     
  14. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    При создании каждого нового потока инкрементировать счетчик, что было в моем коде, который я тебе показывал. При завершении потока, соответственно декремент
     
  15. Tribal_0_o

    Tribal_0_o New Member

    Joined:
    7 Nov 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, как мне организовать передачу данных и вызов функций из моей программы и dll. Dll подгружена в чужом процессе и хукает пару функций.
     
  16. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    IPC / RPC / named pipes и тому подобные средства помогут.
     
  17. seregahowe

    seregahowe Elder - Старейшина

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Всем здравствуйте. Задача в следующем, давно хотел написать прогу для управления некой базой данных в обычном текстовом формате без сторонних библиотек. Теперь сижу и мучаюсь. Как осуществить поиск по одному значению не проблема. А Как осуществить поиск по нескольким значениям? То есть вбиваем в текстовые поля значения, проверяем, есть ли эти значения в строке, если есть, выводим.
     
  18. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    В каком формате хранятся данные?
     
  19. Compton

    Compton Member

    Joined:
    31 Jan 2010
    Messages:
    290
    Likes Received:
    25
    Reputations:
    0
    Как по нажатию кнопки можно перезагрузить форму? (По факту повторно вызвать Form1.Form1_Load)
     
  20. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Ну дык и пиши по щелчку Form1_Load и передавай нужные параметры

    з.ы.: может моя дельфя совершенно устарела, но я впервые слышу о событии Form1_Load
     
Thread Status:
Not open for further replies.