Results 1 to 15 of 15

Thread: Foutmelding E2010 Incompatible types : Pwidechar and string

  1. #1

    Foutmelding E2010 Incompatible types : Pwidechar and string

    Wie kan mij vertellen welke fout ik maak :
    ------------
    var
    aktievenaam,mystring: string;
    aktief: pchar;
    ------------
    new(aktief);
    mystring:=(aktievenaam);
    StringToWideChar(mystring,aktief, Length(mystring) + 1);
    shellExecute(Application.Handle,'open', ('e:\0 info\'+aktief+'\tekst\tekst.docx'),nil,nil,SW_SHOW NORMAL);
    ------------
    De variabele aktief veroorzaakt de foutmelding , ('e:\0 info\directorie\tekst\tekst.docx'),nil,nil,SW_SHOW NORMAL) werkt wel .
    Hoe kan ik dit oplossen.
    Met vriendelijk groet,
    Damion

  2. #2
    Volgens mij moet je StringToWideChar niet gebruiken, maar direct casten naar PChar. Zoiets als hieronder.

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      AktieveNaam, path: string;
    begin
      AktieveNaam := 'test.docx';
      path := Format('E:\Downloads\%s', [AktieveNaam]);
      ShellExecute(Application.Handle, 'open', PChar(path), nil, nil, SW_SHOWNORMAL);
    end;

  3. #3
    Bedankt voor uw reactie Senior Member.
    Ik heb het volgende gedaan.

    Delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var
    3.   AktieveNaam, path,s,tekst: string;
    4. begin
    5.   s:=(aktievenaam);
    6.   tekst := 'test.docx';
    7.   path := Format('E:\Downloads\%s', [tekst]);
    8.   ShellExecute(Application.Handle, 'open', PChar(path), nil, nil, SW_SHOWNORMAL);
    9. end;
    Dit werkt niet.
    Het gaat fout bij %s , als ik dit vervang in
    path := Format('E:\Downloads\juistedir', [tekst]); (juistedir is de directorie die moet worden geopend)
    Dan gaat het gedeeltelijk goed .
    Nu gaat er een scherm open in de juiste directorie , maar file test.docx gaat niet open , ik moet deze zelf openen.
    Dit is nog geen bezwaar , het grootste probleem is om de juiste directorie te komen.

    Groetjes
    Damion
    Last edited by GolezTrol; 31-Jul-18 at 16:35.

  4. #4
    Moderne Delphi?
    Dan wellicht PWideChar(Path) i.p.v. PChar(path) omdat strings dan WideStrings zijn?

    Bart

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Damion, Jouw code hierboven werkt prima onder D10 Tokyo. Ik heb een tekstbestand gebruikt i.p.v. een word document en deze wordt netjes geopend.
    Het gaat fout bij %s , als ik dit vervang in
    path := Format('E:\Downloads\juistedir', [tekst]); (juistedir is de directorie die moet worden geopend)
    Hoe wordt deze geformuleerd in jouw programma.

    @Bart,
    Pchar is al geconverteerd naar Unicode.
    Delphi is great. Lazarus is more powerfull

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Klopt, in latere Delphi (>D2009) versies is PChar meegegaan naar de WideString-variant.

    Het ShellExecute's "Open" commando opent het opgegeven pad in de geassocieerde applicatie die erbij hoort.
    Is een document niet (correct) geassocieerd aan een applicatie, dan kunnen er onvoorspelbare dingen gebeuren.

    Je kunt ShellExecute ook aanroepen met een parameter voor de executable, zoals:
    ShellExecute(0, 'open', PChar(PadNaarNnotepad.exe), PChar(PadNaarMijnTekst.txt), nil, SW_SHOWNORMAL);

    Ik gebruik ShellExecute zelf eigenlijk nog maar heel weinig (zeg maar gerust "Nooit"), maar lees de opgegeven
    link boven eens, dan weet je een beetje wat je aan het doen bent, want zomaar alles blind koppie-peesten van
    internet word je ook niet veel wijzer van.
    TMemoryLeak.Create(Nil);

  7. #7
    Controleer even of alle paden/bestandsnamen kloppen. Ik had in mijn voorbeeldje het een en ander aangepast. test.docx was in jouw code tekst.docx en ook het pad is niet hetzelfde. Bij mij opent ie gewoon het document.

  8. #8
    Lazarus heeft OpenDocument()

    Bart

  9. #9
    Ik gebruik XE7

    Ik heb gedaan wat VideoRipper adviseerde .

    procedure TForm1.Button1Click(Sender: TObject);
    var
    AktieveNaam, path,tekst: string;
    begin
    aktievenaam:= ******; //wordt hier opgehaald
    tekst := 'tekst.docx';
    path := Format('E:\0 info\'+aktievenaam+'\tekst',[tekst]);
    ShellExecute(0, 'open', PChar('c:\windows\notepad.exe'), PChar(Path), nil, SW_SHOWNORMAL);
    end;

    Nu werkt het.
    Hartelijk dank.
    Groetjes Damion.

  10. #10
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Je format kan ook mooier (en in je laatste reactie werkt het ook niet goed):
    Delphi Code:
    1. Path := Format('E:\0 info\%s\%s', [ActieveNaam, Tekst]);
    Persoonlijk hou ik ook vaak wel van indexering bij het gebruik van Format, zodat je dubbele
    waarden maar één maal hoeft mee te geven en ik vind het dan ook makkelijker om, vooral bij
    langere format-strings, de parameters duidelijker te kunnen aanwijzen (bij het opbouwen van
    de string of juist het debuggen ervan).
    Delphi Code:
    1. Path := Format('E:\0 info\%0:s\%1:s', [ActieveNaam, Tekst]);
    (Indexering is ook hier 0-based)
    TMemoryLeak.Create(Nil);

  11. #11
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (Voor de geïnteresseerden in het waarom: een string literal is pchar compatible, (kan daar aan toegekend worden), daarom is er geen typecast nodig bij de niet samengestelde string (een string literal), en wel bij de samengestelde (van type string))

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by marcov View Post
    (Voor de geïnteresseerden in het waarom: een string literal is pchar compatible, (kan daar aan toegekend worden), daarom is er geen typecast nodig bij de niet samengestelde string (een string literal), en wel bij de samengestelde (van type string))
    Hahahaha: ik snap wat je bedoelt en waarom het zo is, maar ik kan me voorstellen dat iemand
    die niet zo thuis is in de materie geen kaas van bovenstaande tekst kan maken.
    TMemoryLeak.Create(Nil);

  13. #13
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by VideoRipper View Post
    Hahahaha: ik snap wat je bedoelt en waarom het zo is, maar ik kan me voorstellen dat iemand
    die niet zo thuis is in de materie geen kaas van bovenstaande tekst kan maken.
    Dat kan ik niet begrijpen? Iedere gebruiker heeft toch de manual helemaal uitgepluisd? Anders is er iets mis! :-)

  14. #14
    Iedere gebruiker heeft toch de manual helemaal uitgepluisd?
    welke manual?

    De laatste Delphi versie met een fatsoenlijke manual en help was D7, das al ff geleden MarcoV

  15. #15
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ja, toen heb ik die ook uitgepluisd, en natuurlijk alle help. Ander formaat (en helaas mindere kwaliteit ) is nog altijd geen excuus het niet eens door te nemen.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •