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


Автор: Ptica_Oz 14.3.2007, 09:30
в ф-цию надо передать два параметра, они должны быть типа PChar.
первый параметр получаю без проблем:
Код

var
   path: PChar;
   s : string;
...
   s := RunMethod('GetFileById',[ParentVersion.inID, fname, str]); 
   path := PChar(s);

все замечательно преобразуется, парадается и работае. а вот со вторым параметром возникают проблемы...
делаю так:
Код

procedure TfrmForm.ComboBox1Change(Sender: TObject);
var
  n : Integer;
  s : string;
begin
  n := ComboBox1.ItemIndex;
  s := ComboBox1.Items[n];
  Printer := PChar(s); //глобальная переменная типа PChar
end;

потом попробовала так:
Код

procedure TfrmForm.ComboBox1Change(Sender: TObject);
type TArrB=array of byte;
var
  n, i : Integer;
  s : string;
begin
  n := ComboBox1.ItemIndex;
  s := ComboBox1.Items[n];
  i := Length(s);
  Printer := PChar(Copy(TArrB(s),0,i));
end;

и в том и в другом случае результат не удовлетворительный  smile 
что делать?

Автор: Sunvas 14.3.2007, 09:42
Цитата(Ptica_Oz @  14.3.2007,  09:30 Найти цитируемый пост)
 результат не удовлетворительный

Ошибку выдает? Или что?

Автор: Ptica_Oz 14.3.2007, 09:47
нет, ошибкинет, но в функцию не передается то что надо, и при пошаговой отладке переменная  Printer не принемает нужное значение

Автор: Elfebet 14.3.2007, 10:19
Цитата

type TArrB=array of byte;


зачем это? это не нужно!, Что-то ты там много лишнего написал. Вот так должно работать
Код

procedure TfrmForm.ComboBox1Change(Sender: TObject);
begin
   Printer := PChar( ComboBox1.Items[ComboBox1.ItemIndex] );
end;


Добавлено @ 10:24 
или так
Код

Printer := PChar( ComboBox1.Text );

в зависимости какой ты поставил стиль на комбобокс

Автор: Ptica_Oz 14.3.2007, 10:47
написала так:
Код

n := ComboBox1.ItemIndex;  
Printer := PChar(ComboBox1.Items[n]);

не помогла...  smile 
а код с type TArrB=array of byte; я на этом форуме нашла

Автор: Yanis 14.3.2007, 10:56
Цитата(Ptica_Oz @  14.3.2007,  10:30 Найти цитируемый пост)
в ф-цию надо передать два параметра, они должны быть типа PChar.

Ну так покажи эту функцию и каким образом ты передаёшь всё добро...

Автор: Ptica_Oz 14.3.2007, 11:12
ф-ция в длл написаная на VC++ кому интересно смотрите http://forum.vingrad.ru/topic-136675/0.html#entry1063599
не стоит замарачиваться куда я это хочу передать. мне просто нужна переменная типа PChar

Автор: Yanis 14.3.2007, 11:18
PChar это обычный указатель на Char. Скорее всего требуется передать указатель именно на первый символ, что бы функция считала все символы следующие дальше за ним. 
Что может быть проще? 
Даю намёк -- @s[1] это и есть указатель на первый символ (т.е. Char), где s is string.

Автор: Ptica_Oz 14.3.2007, 11:28
попробую, но как-то странно получается, один раз PChar преобразовал, другой раз нет...

Автор: Ptica_Oz 14.3.2007, 12:21
Заработало!!! smile  в принципе инструкции те же, но кое-что переместила:
Код

var
  temp : String; // глобальная переменная
...
procedure TfrmForm.ComboBox1Change(Sender: TObject);
var
  n, i : Integer;
begin
  n := ComboBox1.ItemIndex;
  temp := ComboBox1.Items[n];
end;
...
procedure TfrmForm.cmdPrintClick(Sender: TObject);
var
   path: PChar;
   s : string;
   ...
begin
    ...
    s := RunMethod('GetFileById',[ParentVersion.inID, fname, str]);
    path := PChar(s);
    Printer := PChar(temp);
    f := ACADPrint(path, Color, Printer, '!!!', Scale); //  вызов ф-ции
end;

но всётаки почему не работал изначальный код я не поняла... одно дело когда во время разного рода "танцев с бубном" у меня обе переменные типа PChat хранили адрес одной и тойже ячейки... но ведь при пошаговой отладки, когда я отрабатывала событие ComboBox'а второй переменной не существовало в природе... странно как-то... smile 

Автор: Sunvas 14.3.2007, 12:57
Ptica_Oz, почитай о работе с указателями: уверен, найдешь ответ на свой вопрос.

Автор: MetalFan 14.3.2007, 13:07
string, как известно, хитрый тип)

Цитата(Ptica_Oz @  14.3.2007,  09:30 Найти цитируемый пост)
procedure TfrmForm.ComboBox1Change(Sender: TObject);
var
  n : Integer;
  s : string; <-локальная переменная
begin
  n := ComboBox1.ItemIndex;
  s := ComboBox1.Items[n]; <- выделили память под  s, скопировали значение строки
  Printer := PChar(s); <- "запомнили" указатель на первый символ локальной переменной s
end;<- строка s перестает существовать, указатель на первый символ становиться не валидным.

вышеприведенный код
Цитата(Ptica_Oz @  14.3.2007,  12:21 Найти цитируемый пост)
var
  temp : String; // глобальная переменная
...
procedure TfrmForm.ComboBox1Change(Sender: TObject);
var
  n, i : Integer;
begin
  n := ComboBox1.ItemIndex;
  temp := ComboBox1.Items[n];
end;
...
procedure TfrmForm.cmdPrintClick(Sender: TObject);
var
   path: PChar;
   s : string;
   ...
begin
    ...
    s := RunMethod('GetFileById',[ParentVersion.inID, fname, str]);
    path := PChar(s);
    Printer := PChar(temp);
    f := ACADPrint(path, Color, Printer, '!!!', Scale); //  вызов ф-ции
end;

я бы переписал проще:

Код

procedure TfrmForm.cmdPrintClick(Sender: TObject);
var
   path: string;
   printer : string;
   ...
begin
    ...
    path := RunMethod('GetFileById',[ParentVersion.inID, fname, str]);
    Printer := ComboBox1.Items[ComboBox1.ItemIndex];
    f := ACADPrint(PChar(path), Color, PChar(Printer), '!!!', Scale); //  вызов ф-ции
end;

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