Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > InputBox усекает строку


Автор: Akella 27.3.2010, 13:42
Берём длинную ссылку (почти 500 символов) из Google maps, например.
Цитата

http://maps.google.com/maps?f=q&source=s_q&hl=ru&geocode=&q=%D0%BC%D0%B5%D1%80%D0%B5%D1%84%D0%B0&sll=37.0625,-95.677068&sspn=51.974572,135.263672&ie=UTF8&hq=&hnear=%D0%9C%D0%B5%D1%80%D0%B5%D1%84%D0%B0,+%D0%A5%D0%B0%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9,+%D0%A5%D0%B0%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F+%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C,+%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D0%B0&ll=49.816667,36.05&spn=0.00522,0.016512&t=h&z=17


В программе нажимаем кнопку и появляется окно InputBox
Код
sMapUrl := InputBox('Ссылка на карту', 'Вставьте ссылку из браузера на карту:', sMapUrl);


Но вставляется только 256 символов.
Цитата

http://maps.google.com/maps?f=q&source=s_q&hl=ru&geocode=&q=%D0%BC%D0%B5%D1%80%D0%B5%D1%84%D0%B0&sll=37.0625,-95.677068&sspn=51.974572,135.263672&ie=UTF8&hq=&hnear=%D0%9C%D0%B5%D1%80%D0%B5%D1%84%D0%B0,+%D0%A5%D0%B0%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D1%81%D0%B


Почему, как победить?
Не хочется создавать своё новое окно, ведь есть же уже готовый велосипед ввиде InputBox/InputQuery

Добавлено через 2 минуты и 21 секунду
Для чего всё это? Ссылку нужно сохранить в базу (firebird), чтобы потом показать пользователю с возможностью перехода по ссылке щелчком мышки по кнопке, например

Автор: Данкинг 27.3.2010, 14:18
Цитата(Akella @  27.3.2010,  13:42 Найти цитируемый пост)
Почему, как победить?

Если это нужно только для ссылок, то, например, http://tinyurl.ru/#short-url smile 

Автор: Демо 27.3.2010, 14:22
Akella, 

Ошибка (а может и просто ограничение) в генетическом коде.

Проще скопировать в свой код 2 функции, убрав ограничение:

Код

uses Consts

function GetAveCharSize(Canvas: TCanvas): TPoint;
var
  I: Integer;
  Buffer: array[0..51] of Char;
begin
  for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
  for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
  GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
  Result.X := Result.X div 52;
end;

function InputQuery(const ACaption, APrompt: string;
  var Value: string): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TEdit;
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
  Result := False;
  Form := TForm.Create(Application);
  with Form do
    try
      Canvas.Font := Font;
      DialogUnits := GetAveCharSize(Canvas);
      BorderStyle := bsDialog;
      Caption := ACaption;
      ClientWidth := MulDiv(180, DialogUnits.X, 4);
      Position := poScreenCenter;
      Prompt := TLabel.Create(Form);
      with Prompt do
      begin
        Parent := Form;
        Caption := APrompt;
        Left := MulDiv(8, DialogUnits.X, 4);
        Top := MulDiv(8, DialogUnits.Y, 8);
        Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
        WordWrap := True;
      end;
      Edit := TEdit.Create(Form);
      with Edit do
      begin
        Parent := Form;
        Left := Prompt.Left;
        Top := Prompt.Top + Prompt.Height + 5;
        Width := MulDiv(164, DialogUnits.X, 4);
//        MaxLength := 255;
        Text := Value;
        SelectAll;
      end;
      ButtonTop := Edit.Top + Edit.Height + 15;
      ButtonWidth := MulDiv(50, DialogUnits.X, 4);
      ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := SMsgDlgOK;
        ModalResult := mrOk;
        Default := True;
        SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := SMsgDlgCancel;
        ModalResult := mrCancel;
        Cancel := True;
        SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
          ButtonWidth, ButtonHeight);
        Form.ClientHeight := Top + Height + 13;
      end;
      if ShowModal = mrOk then
      begin
        Value := Edit.Text;
        Result := True;
      end;
    finally
      Form.Free;
    end;
end;


Код

  if InputQuery('Ссылка на карту','Вставьте ссылку из браузера на карту:',sMapUrl) then ...

Автор: Akella 27.3.2010, 14:38
Цитата(Демо @  27.3.2010,  14:22 Найти цитируемый пост)
Ошибка (а может и просто ограничение) в генетическом коде.

не понял smile

Добавлено через 1 минуту и 44 секунды
Цитата(Данкинг @  27.3.2010,  14:18 Найти цитируемый пост)
сли это нужно только для ссылок, то, например, вот так. smile 

Не, не, это не годиться. Мои пользователи, в основном, это люди, далёкие от компьютера и интернета. Я сомневаюсь, что они ссылку-то смогут в программу сохранить  smile  не говоря уже о "конвертации" её в краткий формат.

Добавлено через 4 минуты и 48 секунд
//        MaxLength := 255;

Я не понимаю, а зачем "они" это сделали  smile 

Автор: Akella 27.3.2010, 14:54
Цитата(Демо @  27.3.2010,  14:22 Найти цитируемый пост)
Ошибка (а может и просто ограничение) в генетическом коде.

В исходниках что ль?  smile 

Автор: Демо 27.3.2010, 16:22
Цитата(Akella @  27.3.2010,  14:54 Найти цитируемый пост)
В исходниках что ль?  


Ну да!

В геноме Delphi ошибка-)

Автор: Grag 27.3.2010, 16:59
Цитата(Akella @ 27.3.2010,  13:42)
Берём длинную ссылку (почти 500 символов) из Google maps, например.
Цитата

http://maps.google.com/maps?f=q&source=s_q&hl=ru&geocode=&q=%D0%BC%D0%B5%D1%80%D0%B5%D1%84%D0%B0&sll=37.0625,-95.677068&sspn=51.974572,135.263672&ie=UTF8&hq=&hnear=%D0%9C%D0%B5%D1%80%D0%B5%D1%84%D0%B0,+%D0%A5%D0%B0%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9,+%D0%A5%D0%B0%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F+%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C,+%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D0%B0&ll=49.816667,36.05&spn=0.00522,0.016512&t=h&z=17


В программе нажимаем кнопку и появляется окно InputBox
Код
sMapUrl := InputBox('Ссылка на карту', 'Вставьте ссылку из браузера на карту:', sMapUrl);


Но вставляется только 256 символов.


Почему, как победить?


Какой тип возвращает InputBox()? Какой тип имеет sMapUrl?

Автор: Akella 27.3.2010, 17:45
Цитата(Grag @  27.3.2010,  16:59 Найти цитируемый пост)
Какой тип возвращает InputBox()? Какой тип имеет sMapUrl?

sMapUrl типа String так же как и результат InputBox(), а что??

Автор: Grag 28.3.2010, 10:05
Цитата(Akella @ 27.3.2010,  17:45)
Цитата(Grag @  27.3.2010,  16:59 Найти цитируемый пост)
Какой тип возвращает InputBox()? Какой тип имеет sMapUrl?

sMapUrl типа String так же как и результат InputBox(), а что??

А сколько символов может содержать переменная типа String?

Автор: Akella 28.3.2010, 11:19
ms-help://borland.bds5/devcommon/stringtypes_xml.html
About String Types
AnsiString  4 bytes to 2GB
WideString  4 bytes to 2GB

Автор: Grag 28.3.2010, 12:10
Цитата(Akella @ 27.3.2010,  17:45)
Цитата(Grag @  27.3.2010,  16:59 Найти цитируемый пост)
Какой тип возвращает InputBox()? Какой тип имеет sMapUrl?

sMapUrl типа String так же как и результат InputBox(), а что??

А чем отличается тип STRING от AnsiString и WideString?

Автор: Akella 28.3.2010, 12:50
В неюникодных версиях delphi STRING - это AnsiString. В Delphi 2009+ STRING - это уже WideString.

WideString - это юникод.

Добавлено через 30 секунд
http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4

Добавлено через 1 минуту и 20 секунд
http://ru.wikipedia.org/wiki/String

Автор: Grag 28.3.2010, 13:10
InputBox - Функция  Отображает диалог, который просит пользователя о вводе текста, со значением по умолчанию;

function InputBox ( const Caption, Prompt, Default : string ) : string;

Remarks
The InputBox is user-resizable, but has a minimum size of approximately 190 x 115 pixels. Default size is approximately 250 x 190 pixels.

The string returned will not exceed 254 characters and if input contains carriage returns or linefeeds, the result will be truncated at the first occurrence of those characters.



Автор: Akella 28.3.2010, 16:15
Это я понял благодаря Демо. И что?
Цитата(Демо @  27.3.2010,  14:22 Найти цитируемый пост)
//        MaxLength := 255;


Автор: Grag 28.3.2010, 17:36
Цитата(Akella @ 28.3.2010,  16:15)
Это я понял благодаря Демо. И что?
Цитата(Демо @  27.3.2010,  14:22 Найти цитируемый пост)
//        MaxLength := 255;

Ничего, мне кажется, дальнейшие комментарии излишни... smile 

Автор: Akella 28.3.2010, 19:37
Давно излишни smile

Добавлено через 16 секунд
Я ведь уже давно пометил тему, как решённая

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)