Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: D5: Пропадает курсор (при DropDown в ComboBox)  (Прочитано 20130 раз)
0 Пользователей и 1 Гость смотрят эту тему.
newmen_
Гость
« : 30-10-2006 11:24 » 

Проблема в следующем.

При программном присвоении:
ComboBox1.DroppedDown:=True;
пропадает курсор, т.е. перестает быть видимым.

Уже все вроде перепробовал... Может быть кто знает выход из этой ситуации?
Заранее спасибо!!
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 30-10-2006 14:33 » 

если имеется ввиду, что курсор пропадает на поле ввода, то происходит это потому, что фокус перемещается на открывающийся список, а курсор показывается только на активном в данный момент элементе. чтобы он оставался на поле ввода, надо просто вернуть фокус обратно. При этом текущий текст в комбобоксе автоматически выделится, если этого тоже нужно избежать - то стоит сбросить SetLength в 0:

Код:
  ComboBox1.DroppedDown := TRUE;
  ComboBox1.SetFocus;
  ComboBox1.SelLength := 0;

upd: правда, я не знаю, как этот код себя поведёт в пятёрке (в D7 это работает), но вряд ли такие вещи сильно изменились.
« Последнее редактирование: 30-10-2006 15:15 от x77 » Записан

newmen_
Гость
« Ответ #2 : 31-10-2006 03:44 » 

Прошу прощения, второпях забыл уточнить самую важную деталь! Жаль
Курсор пропадает у мыши (и над ComboBox и над формой его не видно), правда на клик и перемещение невидимого курсора приложение реагирует.
т.е. как будто выполнено - ShowCursor(false);

Хотя когда интерактивно разворачиваешь список ComboBox, то все видно.
« Последнее редактирование: 31-10-2006 11:44 от newmen_ » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 31-10-2006 13:15 » 

хы. у меня это не воспроизводится...

это не может быть "штатным", так сказать, глюком, чтобы при выполнении рутинной операции с экрана пропадал курсор. за такие чудеса Багланд бы уже давно грязно и цинично изнасиловали. попробуй выполнить прогу на другой машине. попробуй поменять параметры отображения окон в настройках винды (Show when dragging поставить в TRUE, например). в общем, если я правильно понял ситуацию, то это что-то связанное лично с твоим компом (виндой)
Записан

DemonicAlligator
Гость
« Ответ #4 : 31-10-2006 15:56 » 

oldcursor:=Screen.Cursor;
ComboBox1.DroppedDown:=True;
Screen.Cursor:=oldcursor;
Application.ProcessMessages;

попробуй?
Записан
newmen_
Гость
« Ответ #5 : 01-11-2006 03:27 » 

x77:
Не совсем. Курсор невидим только в пределах формы, за ее пределами все как обычно, не думаю, что дело в винде. Пробовали на разных машинах и разных делфях (d5, d7) - результат один.

Синий Аллигатор:
Я пробовал такой вариант в несколько другом виде:
ComboBox1.DroppedDown:=True;
Screen.Cursor:=crDefault;
и просто (для формы) Cursor:=crDefault;

это не помогает. Еще пробовал:
ShowCursor(true);

тоже бесполезно.   А черт его знает...
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 01-11-2006 13:07 » 

я не смог добиться того, чтобы у меня пропал курсор... да и не должен он пропадать. проверь ещё раз остальной код, что-то там в момент открытия комбобокса происходит.
Записан

DemonicAlligator
Гость
« Ответ #7 : 02-11-2006 11:29 » 

А какие компоненты на форме лежат? нету ненароком, каких хитрых?
Записан
newmen_
Гость
« Ответ #8 : 02-11-2006 13:25 » 

неа, для чистоты эксперимента я создал отдельный проект с 1 формой и 1 КомбоБоксом
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 02-11-2006 13:38 » 

newmen_, приведи весь код основного юнита, плз.
Записан

newmen_
Гость
« Ответ #10 : 03-11-2006 03:42 » 

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Edit1: TEdit; //просто для табуляции
    procedure ComboBox1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function FindStr(substr:string; items1:TStrings):integer;
var
  i:integer;
begin
  result:=-1;
  for i:=0 to items1.Count-1 do begin
    if pos(AnsiUpperCase(substr),AnsiUpperCase(items1[i]))=1 then begin  //слово с 1-позиции
      result:=i; break;
    end;
  end;
end;

procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  ind,subLen:integer;
begin
  if (ord(key)<$30) then exit;

  ind:=FindStr(ComboBox1.Text,ComboBox1.Items);
  if ind>=0 then begin
    subLen:=length(ComboBox1.Text);
    ComboBox1.ItemIndex:=ind;
    ComboBox1.DroppedDown:=true;
    //Application.ProcessMessages;

    if subLen<length(ComboBox1.Text) then begin
      ComboBox1.SelStart:=subLen;
      ComboBox1.SelLength:=length(ComboBox1.Text)-subLen;
    end;
  end else ComboBox1.DroppedDown:=false;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //для примера
  ComboBox1.Items.Add('Япония');
  ComboBox1.Items.Add('Австралия');
  ComboBox1.Items.Add('Россия');
  ComboBox1.Items.Add('Канада');
  ComboBox1.Items.Add('Швеция');
  ComboBox1.Items.Add('Франция');
end;

end.

это для поиска строк по Комбобоксу в 5-ке при наборе. Что-то вроде компенсации отсутствия в ней свойств, которые имеются в 7-ке: AutoComplete и AutoDropDown.
Т.е. вышеописанная проблема появляется при вводе букв - как только (при нахождении подстроки) раскрывается КомбоБокс.
« Последнее редактирование: 07-12-2007 19:51 от Алексей1153++ » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 03-11-2006 10:31 » 

хех. это, всё-таки, стандартная фича. твои процедуры там не нужны, просто открой пустую форму, кинь на неё TEDit, и начни в него что-то вводить. курсор пропадает с экрана.

пока не уверен, что это можно как-то бороть. всё ренализовано на уровне TWinControl, а то и ниже.
Записан

newmen_
Гость
« Ответ #12 : 03-11-2006 10:54 » new

при вводе - да, но стоит только "пошевелить" мышью - курсор появляется. А здесь почему-то нет. Я пытался посмотреть, как у них классы реализованы, но для меня это слишком пока сложно.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines