MorphOS.pl – Polska strona użytkowników MorphOS-a
MorphOS.pl – Polska strona użytkowników MorphOS-a

Strona główna Forums Dla programistów Clipboard i C

  • This topic has 6 odpowiedzi, 2 głosy, and was last updated 12 years temu by edeede.
Widok 7 wpisów - 1 z 7 (of 7 wszystkich)
  • Autor
    Wpisy
  • #226
    edeede
    Participant

    Jakiej funkcji należy użyć aby otrzymać w zadeklarowanej wcześniej tablicy tekst z systemowego schowka ?
    Zależy mi aby dane otrzymane w tablicy były w formie strumienia włącznie z EOF.

    #1056
    Avatarkrashan
    Participant

    W tablicy to chyba nie bardzo, bo przecież nie znasz długości tych danych. Tak czy inaczej są dwa sposoby. Albo używasz iffparse.library, albo otwierasz clipboard.device i czytasz przez CMD_READ. Z tym, że weź pod uwagę, że dane w schowku nie są „gołym” tekstem, ale są trzymane w formacie IFF FTXT.

    #1057
    edeede
    Participant
    W tablicy to chyba nie bardzo, bo przecież nie znasz długości tych danych.

    Otóż to, mam trudność w rozpoznaniu długości tych danych. Ogólnie rzecz biorąc chciałbym w swoim programie jako dane wejściowe umieścić tekst zawarty w systemowym schowku. Problemu nie ma jeśli potrzebowałbym "wklejać" tylko jedną linię, jednak docelowo wejściowy tekst ma składać się z wielu linii. Próbowałem ułatwić sobie zadanie wykorzystując Console MUI i pobierać wklejony tekst w pętli po jednym znaku, jednak jedyny dostępny znak sterujący w tym układzie to ‘n’. W przyszłości chciałbym do tego (wklejania i ew. prostego edytownia) wykorzystać odpowiednią klasę MUI, ale na razie chcę aby działało z CLI. W każdym razie już tak namotałem, że nie mam pewności którędy. :]

    #1058
    Avatarkrashan
    Participant
    Otóż to, mam trudność w rozpoznaniu długości tych danych.

    Sparsuj IFF-a. W nagłówku chunka CHRS jest podana długość. W sumie nie byłoby głupim napisać jakąś gotową funkcję do tego… A do niej tutorial, kaska na bounty leży. Tym bardziej, że morphosowy schowek ma już obsługę unikodu, ale nie jest to nigdzie udokumentowane jeszcze.

    #1059
    edeede
    Participant

    Parser w zasadzie gotowy, wyłuskany tekst zapisany do tablicy dynamicznej, zaalokowana pamięć zwalniana.
    Paradoksalnie, (takie odnoszę wrażenie) teraz łatwiej jest mi umieścić instrukcje z głównego programu (nad którym pracowałem wcześniej) wewnątrz tej funkcji a nie odwrotnie, co mogłoby być bardziej pożądane. Tu właściwie utknąłem.

    char *GetClipboardText();

    int main(void)
    {
    char *text_addr;
    text_addr = GetClipboardText();

    // co robić :}

    free (text_addr);

    return 0;
    }


    char *GetClipboardText()
    {

    char *text_tab;
    ~~~~~~~~~~~~~~~~~

    text_tab = (int*) malloc(text_lenght * sizeof *text_tab);

    return text_tab;
    }

    Jakkolwiek udaje mi się jeszcze (po wywołaniu funkcji) zwolnić zaalokowaną na tablicę pamięć, to dalej w takim układzie nie za bardzo mogę z tych danych korzystać jak wewnątrz funkcji. Tracę też informację o ilości elementów, a szukanie końca ciągu znaków jest bez sensu skoro wcześniej posiadałem taką informację… i tu dla mnie kółko się zamyka a nawet trochę wcześniej. :]

    Ps. Pomysł z bounty jest jak najbardziej ok, mógłbym powiedzieć nawet, że zgłaszam się na ochotnika ale to raczej jak zrobie z tego funkcje 😉

    #1060
    Avatarkrashan
    Participant
    Jakkolwiek udaje mi się jeszcze (po wywołaniu funkcji) zwolnić zaalokowaną na tablicę pamięć, to dalej w takim układzie nie za bardzo mogę z tych danych korzystać jak wewnątrz funkcji. Tracę też informację o ilości elementów, a szukanie końca ciągu znaków jest bez sensu skoro wcześniej posiadałem taką informację…

    Możesz sobie np. zdefiniować strukturę:

    struct MyText
    {
    char *text;
    int length;
    };

    I teraz

    struct MyText *GetClipboardText()
    {
    struct MyText *mt;

    if (mt = AllocMem(sizeof(struct MyText), MEMF_ANY))
    {
    if (mt->text = AllocVec(text_length + 1, MEMF_ANY))
    {
    CopyMem(tekst_z_clipa, mt->text, text_length + 1);
    mt->length = text_length;
    return mt;
    }
    FreeVec(mt->text);
    }
    return NULL;
    }

    void FreeMyText(struct MyText *mt)
    {
    if (mt)
    {
    if (mt->text) FreeVec(mt->text);
    FreeMem(mt, sizeof(struct MyText));
    }
    }

    Teraz masz poprzez MyText dostęp do tekstu i do jego długości.

    #1063
    edeede
    Participant
    Teraz masz poprzez MyText dostęp do tekstu i do jego długości.

    W sumie udało mi się przez *mt, pewnie znowu za bardzo kombinuję…

    struct MyText
    {
    char *text;
    ULONG length;
    }*mt;

    mt = GetClipboardText();

    i dopiero w innych funkcjach mam dostęp przez mt->text.

    Zastanawiam się czy może przez argumenty tych innych funkcji można by przekazać strukturę zwróconą przez GetClipboardText(). :}

Widok 7 wpisów - 1 z 7 (of 7 wszystkich)
  • Musisz być zalogowany aby odpowiedzieć na ten temat.