Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[Turbo Pascal[oud]] Readln in Graphische-mode

Lodyx
64 antwoorden
  • Weet iemand de code voor 'readln' in grafische modus?
    Ik kan in textmode wel gewoon readln gebruiken, maar hoe doe ik dat in Grapische Modus? Is er iemand die zich nog iets van die jaren kan herinneren :P ?

    [readln]
    [code:1:b5b81fc059]
    Program readln_1;
    USES CRT;

    VAR
    variable1 : string;

    BEGIN
    writeln('Enter Value for variable1: ');
    readln(variable1);
    writeln('variable is ',variable1,' ');
    END.
    [/code:1:b5b81fc059]

    [graph]
    [code:1:b5b81fc059]
    PROGRAM read_in_graph;
    USES Graph;

    BEGIN
    ?????
    END.
    [/code:1:b5b81fc059]
  • Heb je zoiets al geprobeerd?[code:1:37546d8599]
    program ReadLn1;

    uses
    Graph;

    var
    Variable1: string;

    begin
    InitGraph(D8bit, m640x480, '');
    if GraphResult <> grOK then
    begin
    WriteLn('Graphics mode 640x480x256 not supported');
    Halt;
    end;
    SetTextStyle(DefaultFont, HorizDir, 1);
    OutTextXY(1, 1, 'Enter a value for Variable1:');
    ReadLn(Variable1);
    OutTextXY(1, 20, 'Variable1 = '+Variable1);
    OutTextXY(1, 40, 'Hit Enter to continue…');
    ReadLn;
    CloseGraph;
    end.
    [/code:1:37546d8599]
  • Nee Kamikaasje, kijk het probleem is dat je dan weer terug gaat naar de textmode, en dan krijg je dwars door je GUI een vage balk hoe meer je typt hoe langer de balk wordt. Ik kon in tutorials en boeken ook niks vinden terwijl dit toch redelijk belangrijk is…
  • Probeer dit eens?

    [code:1:7bb5019e61]
    program ReadLn1;

    uses
    Graph;

    var
    Variable1: string;

    procedure ReadTextXY(X, Y: byte; var S: string);
    var
    SLen: byte absolute S;
    Ch: char;
    begin
    repeat
    OutTextXY(X, Y, S+'_ ');
    Ch := ReadKey;
    case Ch of
    ^H: if Length(S) > 0 then SLen := SLen - 1;
    ' '..'~', #128..#254: S := S + Ch;
    end;
    until Ch = ^M;
    end;

    begin
    InitGraph(D8bit, m640x480, '');
    if GraphResult <> grOK then
    begin
    WriteLn('Graphics mode 640x480x256 not supported');
    Halt;
    end;
    SetTextStyle(DefaultFont, HorizDir, 1);
    OutTextXY(1, 10, 'Enter a value for Variable1:');
    Variabele1 := '';
    ReadTextXY(1, 20, Variable1);
    OutTextXY(1, 30, 'Variable1 = '+Variable1);
    OutTextXY(1, 40, 'Hit Enter to continue…');
    ReadLn;
    CloseGraph;
    end.
    [/code:1:7bb5019e61]
  • hmm….. ik zal je zo zeggen of ik het snap
  • Klopt niet.
    a) [code:1:25fb8e09b6]USES CRT, GRAPH[/code:1:25fb8e09b6]
    b) [code:1:25fb8e09b6]^H: if Length(S) > 0 then SLen := SLen - 1; [/code:1:25fb8e09b6] geeft de volgende melding: 'Error 91: ":=" expected.'
    als ik daar [code:1:25fb8e09b6]^H: if Length(S) > 0 then SLen := SLen := - 1; [/code:1:25fb8e09b6] van maak zegt de Compiler Constant out of range.
  • (A) Dit kan kloppen. Ik doe dit hier uit m'n hoofd omdat ik Turbo Pascal hier niet geinstalleerd heb. Maar ik neem aan dat je zelf ook een beetje meedenkt.

    (B) Snap ik niet. Die regel is goed. SLen := SLen - 1; vermindert de lengte van S met 1 en verwijdert dus effectief de laatste letter van S (^H is namelijk de backspace key). Waar exact in die regel geeft ie de foutboodschap?
  • in pascal is ^ toch een pointerderefentie, ik denk niet dat ie dat lekker vind dan. Kan je niet beter de numerieke waarde opzoeken en hierop testen?
  • Als je ^ achter een pointervariabele naam zet dan is het een pointer reference.

    Je kunt ^H vervangen door #8 maar ^H moet ook werken. Hij geeft ook geen foutmelding op ^M neem ik aan?
  • [quote:c6a23a1ab9="Kamikaasje"] Hij geeft ook geen foutmelding op ^M neem ik aan?[/quote:c6a23a1ab9]
    Geen idee, hij komt niet verder dan de 1ste melding. :<
  • [b:0b4b329f7d]*AndreasV's pascal is een beetje weggezakt na een aantal weken Java zonder pointers en vooral veel c++ met functionpointers :oops: [/color:0b4b329f7d][/b:0b4b329f7d]
  • SLen := SLen := - 1; [code] Dit mag nooit in pascal he, in C overigens wel :-P Welke regel geeftie die error precies?
  • Hehehehe, ja, ik moest eerst ook weer even diep graven, maar het komt langzaam weer allemaal boven :)

    Als ik me goed herinner heeft Borland een paar jaar terug TurboPascal freeware gemaakt. Ik zal eens op hun site zoeken of ik een download link kan vinden. Weer eens even installeren. Lijkt me wel geinig. Ben inmiddels in een behoorlijk nostagische bui aanbeland :)
  • Ok, ik heb me even uitgeslooft :)
    Allereerst heb ik Turbo Pascal 5.5 gedownload van Borland's website, hier:

    http://community.borland.com/article/0,1410,20803,00.html

    Vervolgens de code gecompileerd (zaten inderdaad een paar typfoutjes in). Deze code werkt:

    [code:1:b063aba922]
    program ReadLn1;

    uses
    Graph, Crt;

    var
    GraphDriver: integer;
    GraphMode: integer;

    Variable1: string;

    procedure ReadTextXY(X, Y: byte; var S: string);
    var
    SLen: byte absolute S;
    Ch: char;
    begin
    repeat
    OutTextXY(X, Y, S+'_ ');
    Ch := ReadKey;
    case Ch of
    ^H: if Length(S) > 0 then SLen := SLen - 1;
    ' '..'~', #128..#254: S := S + Ch;
    end;
    until Ch = ^M;
    end;

    begin
    GraphDriver := VGA;
    GraphMode := VGAhi;
    InitGraph(GraphDriver, GraphMode, '');
    if GraphResult <> grOK then
    begin
    WriteLn('Graphics mode 640x480x256 not supported');
    Halt;
    end;
    SetTextStyle(DefaultFont, HorizDir, 1);
    OutTextXY(1, 10, 'Enter a value for Variable1:');
    Variable1 := '';
    ReadTextXY(1, 20, Variable1);
    OutTextXY(1, 30, 'Variable1 = '+Variable1);
    OutTextXY(1, 40, 'Hit Enter to continue…');
    ReadLn;
    CloseGraph;
    end.
    [/code:1:b063aba922]

    en dit getest op Windows XP in een DOS box, en het werkt nog ook, graphics mode and all !!! (Had ik eerlijk gezegd niet gedacht dat dit nog zou werken in XP, zeker niet in graphics mode :)
  • Voor de nieuwsgierigen onder ons, waar zat nu de fout, in welke regel?
  • Hehehe, zoek de verschillen :)

    Maaruh, ik had ergens "Variabele1" i.p.v "Variable1" getypt. Bovendien moeten de parameters van InitGraph variabelen zijn (constanten mag niet). Tis ook alweer zo lang geleden :)
  • dat krijg je hé als je geen hungarian-notatie gebruikt ;).
  • Even nog 'n klein beetje mooier gemaakt (ik kon het niet laten) :D[code:1:3e8917704e]program ReadLn1;

    uses
    Graph, Crt;

    const
    Backspace = #8;
    Enter = #13;

    var
    GraphDriver: integer;
    GraphMode: integer;
    Variable1: string;

    procedure ReadTextXY(X, Y, MaxLen: byte; TextLabel: string; var S: string);
    var
    SLen: byte absolute S;
    SWidth: integer;
    SHeight: integer;
    CursorWidth: integer;
    Key: char;
    begin
    OutTextXY(X, Y, TextLabel);
    X := X + TextWidth(TextLabel);
    CursorWidth := TextWidth('_');
    SWidth := TextWidth(S);
    SHeight := TextHeight(S);
    SetFillStyle(1, Black);
    repeat
    Bar(X, Y, X+SWidth, Y+SHeight);
    OutTextXY(X, Y, S+'_');
    Key := ReadKey;
    case Key of
    Backspace:
    if Length(S) > 0 then
    begin
    SWidth := TextWidth(S)+CursorWidth;
    SLen := SLen - 1;
    end;
    ' '..'~', #128..#254:
    if SLen < MaxLen then
    begin
    S := S + Key;
    SWidth := TextWidth(S)+CursorWidth;
    end;
    end;
    until Key = Enter;
    end;

    begin
    GraphDriver := VGA;
    GraphMode := VGAhi;
    InitGraph(GraphDriver, GraphMode, '');
    if GraphResult <> grOK then
    begin
    WriteLn('VGA graphics mode not supported');
    Halt;
    end;

    Variable1 := '';
    SetTextStyle(DefaultFont, HorizDir, 1);
    ReadTextXY(1, 10, 30, 'Enter a value for Variable1: ', Variable1);
    OutTextXY(1, 30, 'Variable1 = '+Variable1);
    OutTextXY(1, 50, 'Hit Enter to continue…');
    ReadLn;

    CloseGraph;
    end.[/code:1:3e8917704e]
  • Ben hem aan het overtypen (btw ik gebruik TP7 niet 5.5 maar oke zoveel verschillen zijn er niet).
    Is er niet een standaard ReadTexXY opdracht in TP in Graphische mode?
    Vind ik beetje dom gedaan. Maar oke.

    Bij de 'nieuwste code' krijg ik mijn eigen foutmelding (VGA not supported);
    Als ik de grOK check weglaat, krijg ik 'Grapics not Initialized (Use InitGraph)' :-?
  • Ik vond alleen 5.5 gratis op de Borland website. Kweet niet of 7.0 ook inmiddels gratis is. Maar 't scheelt inderdaad niet veel.

    Waarom typ je t over??? Doe toch een copy&paste. Das toch veel sneller, en minder kans op typvouten :)

    [i:0644d4f3b9]> Is er niet een standaard ReadTexXY opdracht in TP in Graphische mode? [/color:0644d4f3b9][/i:0644d4f3b9]

    Voor zover ik weet niet. De Graph unit is altijd een beetje een ondergeschoven kindje geweest.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.